反射是反射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的