加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从类型创建泛型变量 – 如何?或者使用带有属性{}而不是参

发布时间:2020-12-15 18:30:41 所属栏目:百科 来源:网络整理
导读:我目前正在使用Generics来制作一些动态方法,比如创建一个对象并用值填充属性. 有没有办法在不知道类型的情况下“动态”创建Generic?例如: ListString = new ListString() 是一种预先确定的方式,但是 List(object.GetType()) = new List(object.GetType()()
我目前正在使用Generics来制作一些动态方法,比如创建一个对象并用值填充属性.

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

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

那么,简而言之:如何在不使用泛型的情况下采用“类型”并从中创建对象?到目前为止,我只在方法中使用了泛型,但是可以在变量上使用相同的方法吗?我必须在方法之前定义Generic(T),所以我可以在“创建”它们之前对变量做同样的事情吗?

…或者如何使用“Activator”创建一个带有Properties而不是Parameters的对象.就像你在这里一样:

//使用参数值

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读