从变量

时间:2016-10-06 07:36:51

标签: c# variables object generics instantiation

我想实例化一个新对象,其中类型和泛型类型被定义为变量。最终结果可能类似于在此手动创建的newListOfObject:

var newListOfObjects = new List<TabViewModel>();

TabViewModel是以下对象:

public class TabViewModel
{
    public string Title { get; set; }
    public int TabOrder { get; set; }
}

尝试仅使用变量实例化新对象时出现问题。我们有一个泛型类型变量genericType,它是一个接口和一个类型参数列表listOfTypeArgs。在上面的示例中,泛型类型将是IList,参数将是TabViewModel。然后它会跟随(注意,一些代码是psudo以便于理解):

Type genericType = IList'1;
Type[] listOfTypeArgs = TabViewModel;
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs));

很明显,我收到了错误&#39; System.MissingMethodException&#39;注意我无法从接口实例化变量。

如何将界面转换为代表,以便我可以 实例化新对象?

注意:我无法更改Type genericType = IList&#39; 1;也不     键入[] listOfTypeArgs = TabViewModel;

2 个答案:

答案 0 :(得分:0)

您需要使用List<>类型,如下所示:

var genericType = typeof(List<>);
var boundType = genericType.MakeGenericType(typeof(TabViewModel));
var instance = Activator.CreateInstance(boundType);

答案 1 :(得分:0)

错误是自描述的,您需要具体类型来创建实例。而不是IList(没有实现而只是合同),您需要使用IList的实现:

Type genericType = typeof(List<>);
Type[] listOfTypeArgs = new[] { typeof(TabViewModel) };
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs));

修改

如果您没有具体类型,则需要使用容器或反映当前程序集。下面是一些你需要调整你发现对你的案例有用的方法的黑客。

Type genericType = typeof(List<>);
Type concreteType = AppDomain.CurrentDomain.GetAssemblies()
                            .SelectMany(s => s.GetTypes())
                            .Where(p => genericType.IsAssignableFrom(p)).FirstOrDefault();

Type[] listOfTypeArgs = new[] { typeof(TabViewModel) };
var newObject = Activator.CreateInstance(concreteType.MakeGenericType(listOfTypeArgs));