6

我目前正在使用泛型来制作一些动态方法,例如创建一个对象并用值填充属性。

有没有办法在不知道类型的情况下“动态”创建泛型?例如:

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 };
4

3 回答 3

13

您可以使用MakeGenericType

Type openListType = typeof(List<>);
Type genericListType = openListType.MakeGenericType(obj.GetType());
object instance = Activator.CreateInstance(genericListType);
于 2012-05-22T19:44:46.747 回答
6

您可以使用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>
于 2012-05-22T19:44:42.747 回答
1

当您使用对象初始化器时,它只是使用默认构造函数(无参数),然后在构造对象后设置各个属性。

上面的代码很接近——但var在这里不起作用,因为它只是一个编译时类型推断。由于您已经在使用反射,您可以使用System.Object

object propertyValue = values[p.Name];

调用将SetValueSystem.Object.

于 2012-05-22T19:41:46.367 回答