您的位置:首页 > 编程语言 > C#

c#:反射访问私有变量

2016-09-14 10:12 603 查看
反射是反射dll程序集中的信息

用反射可以做几件事,下面演示如何访问private

比如这有一个Class Library 叫TicketLibrary

里面有一个Class叫TicketInfo



TicketInfo.cs 里面有一个叫ticketList的private static List

namespace ReflectTest
{
public class TicketInfo
{
private static List<String> ticketList = new List<String>()
{
"T1","T2","T3","T4","T5","T6","T7","T8","T9","T10",
"T11","T12","T13","T14","T15","T16","T17","T18","T19","T20",
"T21","T22","T23","T24","T25","T26","T27","T28","T29","T30",
"T31","T32","T33","T34","T35","T36","T37","T38","T39","T40",
"T41","T42","T43","T44","T45","T46","T47","T48","T49","T50"
};
}
}


正常是无法直接访问该变量的

但是可以使用反射

Program.cs

static void Main(string[] args)
{
try
{
Assembly assembly = Assembly.LoadFrom(@"..\..\..\TicketLibrary\bin\Debug\TicketLibrary.dll");
object obj = assembly.CreateInstance("ReflectTest.TicketInfo");
Type type = obj.GetType();
FieldInfo fieldInfo = type.GetField("ticketList", BindingFlags.NonPublic | BindingFlags.Static);
object value = fieldInfo.GetValue(null);
Console.WriteLine(value.ToString());
Console.WriteLine((value as List<String>).Count);
foreach (String a in (value as List<String>))
{
Console.Write(a + " ");
}
Console.WriteLine();

//MethodInfo method = type.GetMethod("GetAge", BindingFlags.NonPublic | BindingFlags.Instance);
//var methodValue = method.Invoke(obj, null);
//Console.WriteLine(methodValue.ToString());

//object[] customAtt = assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
//foreach(var customAttribute in customAtt)
//{
//    Console.WriteLine(((AssemblyDescriptionAttribute)customAttribute).Description);
//}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}


Assembly.LoadFrom 的是上面工程的dll路径

下面注释的两端代码一个是获取私有函数的

一个是获取AssemblyInfo的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#