在作为参数传递的Type中的方法中实例化Object

时间:2015-10-13 14:46:49

标签: c# .net generics reflection

我正在尝试将Type传递给方法并让它实例化所述Type的Object。我有很多重复的代码,类似于:

foreach (Link link in links)
{
    Object obj = new Object(link);
    list.Add("Description" + obj.prop.ToString());
}

有许多不同的类/对象。

我想:

private void populateList(List<Link> links, Type type, List<val> list, string desc)
{
    foreach (Link link in links)
    {
        //Instantiate Object from type parameter here?
        list.Add(desc + obj.prop.ToString());
    }
}

我尝试使用Generics和Reflection来解决问题:

Type[] typeArgs = {typeof(Link)};
Type constructed = type.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(constructed);

但是我不太确定下一步该去哪里,因为我无法使用o或构造来做我需要的。

我是Reflection和Generics的初学者,所以我甚至不确定我所要求的是否可行。我很欣赏任何有关下一步或任何潜在解决方案的建议。

1 个答案:

答案 0 :(得分:1)

反思适用于此目的

public static T GenerateNewInstance<T>(T obj) where T : class
{
    Type type = typeof (T);
    object instance = Activator.CreateInstance(type);
    return instance as T;
}

我认为你遇到的问题是访问对象属性(prop?)编译器不知道你正在使用什么特定的对象类型,因为它被转换为对象。

您可以使用以下内容创建该工作运行时:

obj.GetType().GetRuntimeProperty("PropertyName").GetValue(obj);

但最终这是将对象强制转换为特定类的问题:

class obj = (class)obj;
list.Add(obj.property.ToString());

编辑:我可能无法正确理解您的问题。 它似乎也想要传递不同类型的。原始类是否具有相同的属性,或者您只是想将给定对象的所有属性添加到列表中?

如果它们具有相同的属性,请考虑创建具有这些属性的接口并使您的类实现它,这样您就可以创建对象的新实例并将其转换为接口,从而获得它们共享的属性。