1.通过字符串反射带泛型参数的类。 使用字符反撇---键盘1左边的那个键。
Type listType = Type.GetType(“System.Generic.List'1”); //List<T>
Type dicType = Type.GetType(“System.Generic.Dictionary'2”); //Dictionary<K,V>
2.识别一个class对象在定义时是否被标记有某个Attribute。
//原始定义
[MyAttribute]
class MyClass{}
//演示代码代码
object myObj = new MyClass();
Attribute atb = System.Attribute.GetCustomAttribute //的到该类定义上制定的属性
( obmyObj.GetType, typeof(MyAttribute),false );
//或者直接获得类定义时的全部属性
System.Attribute.GetCustomAttributes( obmyObj.GetType);
3。判断一个自定义类的实例是否在别的类中作为proptise时被标记了Attribute
//原始定义。
class MyClass{} //自己本身的类定义没有被标记Attribute
class OtherClass
{
[MyAttribute]
MyClass MyObj; //作为其他类的proptise时被标记了Attribute
}
演示代码
OtherClass otherObj = new OtherClass();
FieldInfo[] fields = otherObj.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
Attribute atb = System.Attribute.GetCustomAttribute(
field, //这里是关键。一定是field,而不是field.FieldType
typeof(MyAttribute), false);
Assert.IsNotNull(atb, "获取MyAttribute失败");
}
4. 遍历一个未知类型的所有泛型参数定义
Object dic = new Dictionary<int, string>();
foreach (Type type in dic.GetType().GetGenericArguments()) //这里是关键
{
Console.WriteLine("\r\nGenericArgumentType: {0}", type);
}
5。反射创建未知泛型的实例
//以List<int>为例
Type classType = typeof(List<>); //List<>也可以也可以扩展为别的地方传来的参数。
Type genericType = classType.MakeGenericType(typeof(int)); //这里的typeof(int)也可以扩展为别的地方传来的参数。
object o = Activator.CreateInstance(type);创建实例。
//当然了。这个例子是一个泛型参数的例子。 对于不确定泛型个数的,可以首先通过上一个例子(4)
//先从obj.GetType().GetGenericArguments()获取全部泛型信息后再进行初始化使用。
6。反射得到Array类型中元素的数据类型。
string[] obj = new string[]; //模拟一个未知的数组
Type objType = obj.GetType(); //首先得到数组的Type
Type elementType = objType.GetElementType(); 然后得到数组内部元素的Type