【发布时间】:2014-01-02 13:42:34
【问题描述】:
我只是想知道是否可以在 c# 中公开私有变量?我知道一个类的数据是否是私有的,意味着不能从类外部访问。如果,是,那么如何?
【问题讨论】:
-
修改类还是不修改类?如果您可以修改类,则可以通过属性或方法公开变量。
标签: c# properties access-specifier
我只是想知道是否可以在 c# 中公开私有变量?我知道一个类的数据是否是私有的,意味着不能从类外部访问。如果,是,那么如何?
【问题讨论】:
标签: c# properties access-specifier
这是可能的。为此使用Reflection:
Type type = yourObj.GetType();
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo field = type.GetField("fieldName", flags);
object value = field.GetValue(yourObj);
反射允许在运行时读取类型的元数据并发现类型内部(字段、属性等)。
【讨论】:
非常感谢@Sergey Berezovskiy。
我已经在这个帮助下解决了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ExposePrivateVariablesUsingReflection
{
class Program
{
private class MyPrivateClass
{
private string MyPrivateFunc(string message)
{
return message + "Yes";
}
}
static void Main(string[] args)
{
var mpc = new MyPrivateClass();
Type type = mpc.GetType();
var output = (string)type.InvokeMember("MyPrivateFunc",
BindingFlags.Instance | BindingFlags.InvokeMethod |
BindingFlags.NonPublic, null, mpc,
new object[] {"Is Exposed private Member ? "});
Console.WriteLine("Output : " + output);
Console.ReadLine();
}
}
}
【讨论】:
您可以使用反射来访问私有变量。不过,尽管有点跑题,我还是想分享一些关于 InternalsVisibleTo 的内容。
假设您在程序集中有您的域对象 MyExample.DomainObjects 并且您不想将设置器公开,但您需要您的服务层能够写入它们,但它位于单独的程序集中,您可以仍然使用内部设置器并避免反射:
namespace MyExample.DomainObjects {
public class MyObject{
public string MyProp { get; internal set; }
}
}
如果您将以下内容放在 MyExample.DomainObjects 项目的 AssemblyInfo.cs 中,您可以将 MyExample.ServiceLayer 放在单独的程序集中
[assembly: InternalsVisibleTo("MyExample.ServiceLayer")]
然后您可以从 MyExample.ServiceLayer 调用 MyExample.DomainObjects 中的内部设置器。
【讨论】: