从类型创建泛型变量 - 如何?或者使用带有属性 { } 而不是参数 ( ) 的 Activator.CreateInst
本文关键字:参数 CreateInst Activator 属性 变量 泛型 创建 类型 如何 或者 | 更新日期: 2023-09-27 18:35:05
我目前正在使用泛型来制作一些动态方法,例如创建一个对象并用值填充属性。
有没有办法在不知道类型的情况下"动态"创建泛型?例如:
List<String> = new List<String>()
是一种预定义的方式,但是
List<(object.GetType())> = new List<(object.GetType()>()
不工作...但是可以吗?
这是行不通的(有没有类似的方法有效?
public T CreateObject<T>(Hashtable values)
{
// If it has parameterless constructor (I check this beforehand)
T obj = (T)Activator.CreateInstance(typeof(T));
foreach (System.Reflection.PropertyInfo p in typeof(T).GetProperties())
{
// Specifically this doesn't work
var propertyValue = (p.PropertyType)values[p.Name];
// Should work if T2 is generic
// var propertyValue = (T2)values[p.Name];
obj.GetType().GetProperty(p.Name).SetValue(obj, propertyValue, null);
}
}
那么,简而言之:如何在不使用泛型的情况下获取"类型"并从中创建对象?到目前为止,我只在方法中使用泛型,但是是否可以在变量上使用相同的方式?我必须在方法之前定义一个泛型 (T),那么我可以在"创建"变量之前对它们做同样的事情吗?
。或者如何使用"激活器"创建具有属性而不是参数的对象。就像你在这里所做的:
带有参数值
Test t = new Test("Argument1", Argument2);
具有属性
Test t = new Test { Argument1 = "Hello", Argument2 = 123 };
您可以使用
MakeGenericType
:
Type openListType = typeof(List<>);
Type genericListType = openListType.MakeGenericType(obj.GetType());
object instance = Activator.CreateInstance(genericListType);
可以使用 MakeGenericType 方法获取特定类型参数的泛型类型:
var myObjListType = typeof(List<>).MakeGenericType(myObject.GetType());
var myObj = Activator.CreateInstance(myObjListType);
// MyObj will be an Object variable whose instance is a List<type of myObject>
使用对象初始值设定项时,它只是使用默认构造函数(无参数),然后在构造对象后设置各个属性。
上面的代码很接近 - 但var
在这里不起作用,因为它只是一个编译时类型推断。由于您已经在使用反射,因此您只需使用System.Object
object propertyValue = values[p.Name];
SetValue
调用将正常工作System.Object
.