解惑

解己之惑,解人之惑

标签:反射

反射获取集合中指定下标的元素

不废话了,直接上代码吧:

public static object GetElementFromCollection(object obj, int index)
{
Type type = obj.GetType();
if (type.IsArray)
{
return ((Array) obj).GetValue(index);
}
else
{
object[] attributes = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);
DefaultMemberAttribute attribute = (DefaultMemberAttribute) attributes[0];
String indexerName = attribute.MemberName;
type.GetProperties();
PropertyInfo pi2 = type.GetProperty(indexerName, new Type[] { typeof(int) });
return pi2.GetValue(obj, new Object[] {index});
}
}

反射创建一个指定类型的List

由于最近在做C#版的测试框架,所以对C#的反射研究得比较多一点,这里是另外一个心得,由于运行时才知道类型,所以如何创建一个指定类型的List?其实很简单:

Type elementType = realType;
Type listType = typeof(List<>);
Type typedListType = listType.MakeGenericType(elementType);

c#反射之Enum篇

因为最开始就遇到这个问题,所以单独提出来,不废话了,上代码吧

Assembly assembly = Assembly..Load(“MyDLL”);
Type type = assembly.GetType(“MyDLL.MyEnum”);
FieldInfo enumItem = type.GetField(“ENUM_TEST”);
object enumValue= Enum.ToObject(type, enumItem.GetValue(type));
最后一行代码得到的就是对应的enum对象的实例,可以传递给方法调用,type.GetField方法中的字符串其实就是enum中的字符串名字。要得到这个名字的列表也很容易:

string[] names = Enum.GetNames(type);

c#反射入门篇

主要就是几点

加载DLL

通过Assembly类的方法,主要是Load,还有其他一些方法可以自己研究下,Load方法可以传一个简单名,也可以传完整的限定名,传简单名(MyDLL)的时候,对应的DLL文件(MyDLL.dll)必须位于当前目录?(或者是PATH里面),如果是引用系统注册的DLL,则必须是完整的限定名,例如:MyDLL, Version=1.0.0.0, Culture=Neutral, PublickeyToken=d3cc2ceeafb73bc1

得到Type

这个没有什么,调用上面得到Assembly实例的GetType就行了

创建实例

得到Type以后,使用Activator.CreateInstance就可以了

调用方法

通过Type的GetMethod得到需要调用的MethodInfo对象,然后调用MethodInfo的Invoke方法。

废话少说,看代码吧:

Assembly assembly = Assembly..Load(“MyDLL”);
Type type = assembly.GetType(“MyDLL.MyClass”);
object obj = Activator.CreateInstance(type);
MethodInfo createMethod = type.GetMethod(“MyMethod”);
object[] parameters = new object[1];
parameters[0] = “ParameterValue”
object result = createMethod.Invoke(obj, parameters);

其实和Java差不多,就是java不需要load那一步,因为默认是从CLASSPATH中的所有jar中都可以load的,这个是JVM做的事情。如果需要load其他的不在CLASSPATH中的jar也是可以的,比较麻烦而已。

研究c#的反射机制

要做一个通用的自动测试框架,通过写xml文件完成Test Case的构建,由于打算支持COM和普通的DLL的方法调用,所以必须基于反射来做了。

大概看了下,好像也不是很复杂,就是得一步一步的试了。

© 2022 解惑

本主题由Anders Noren提供向上 ↑