C# 反射创建泛型实例

2021/7/16 11:14:33

本文主要是介绍C# 反射创建泛型实例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

准备一个泛型类和一个已经有具体类型的属性

1 public class PropertyClass<T1, T2>
2     {
3     }
4 
5     public class Test
6     {
7         public PropertyClass<string, int> P { get; set; }
8     }

准备一个方法来实例化有具体类型的属性

 1 public static void Instantiationa(object obj, string propertyName)
 2         {
 3             var type = obj.GetType();
 4 
 5             var property = type.GetProperty(propertyName);//获取属性信息
 6 
 7             var t = property.PropertyType;
 8             if (t.IsGenericType)
 9             {
10                 var types = t.GenericTypeArguments;//获取泛型类的真实类型参数
11                 var tm = typeof(PropertyClass<,>);//获取开放泛型
12                 var ttt = tm.MakeGenericType(types);//根据类型参数获取具象泛型
13                 var value = Activator.CreateInstance(ttt);//实例化
14                 property.SetValue(obj, value);//赋值
15             }
16         }

运行

 1 private static void Main(string[] args)
 2         {
 3             var test = new Test();//此处不实例化属性;
 4             if (test.P == null)
 5             {
 6                 Console.WriteLine("属性为空");
 7             }
 8             Instantiationa(test, "P");
 9             if (test.P != null)
10             {
11                 Console.WriteLine("属性已经被实例化");
12             }
13         }

运行结果 

 

再创建一个 实例化具象类型的方法 

在泛型类里面添加2个属性

1 public class PropertyClass<T1, T2>
2     {
3         public T1 Value1 { get; set; } = default;
4 
5         public T2 Value2 { get; set; } = default;
6     }

创建实例化的方法

1  public static object InstantiationaReal()
2         {
3             var type = typeof(PropertyClass<,>);
4             var types = new Type[] { typeof(double), typeof(bool) };//具体类型
5             var trueType = type.MakeGenericType(types);//根据类型参数获取具象泛型
6             var obj = Activator.CreateInstance(trueType);
7             return obj;
8         }

 

运行

 1  private static void Main(string[] args)
 2         {
 3 
 4             var obj = (PropertyClass<double, bool>)InstantiationaReal();
 5 
 6             if (obj!=null)
 7             {
 8                 Console.WriteLine(obj.Value1);
 9                 Console.WriteLine(obj.Value2);
10             }
11             
12         }

结果

 



这篇关于C# 反射创建泛型实例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程