Box C#对象作为通用接口

时间:2015-05-14 11:30:51

标签: c# generics interface

我有大量的视图模型,每个视图模型都是针对一种特定的对象类型设计的(例如Person,Car等等)。我想为这些添加通用功能,例如能够检查是否已存在包含特定对象(包含特定Car,Person等)的viewmodel。我希望能够动态创建ViewModel(例如,为Car创建viewmodel,为Person创建viewmodel)。所有视图模型都将具有不同的功能,命令等,因此我不能简单地使用一个全局视图模型。是否可以使用接口来解决这个问题,或者这是一个根本上有缺陷的设计模式?

当前代码:

    "level":mycat,
    "extra":mytimer,
    "pid":pid

目前的代码不起作用,因为我无法使用" x作为IViewModel(类型)"。有没有不同的拳击方式' x'以便我可以通过界面访问它?

2 个答案:

答案 0 :(得分:5)

您不能将Type实例用作通用参数 - 它必须是编译时类型。

像这样更改MethodToBeCalled

public void MethodBeingCalled<T>(IViewModel<T> viewModelInstance)
{
    var x = viewModelInstance.DataModelObject;
}

通常,泛型倾向于通过代码库传播。虽然动态泛型调度可能,但它总是涉及反射 - 这通常是完全没必要的。

答案 1 :(得分:1)

如果您坚持不更改方法的签名,则需要使用'getInterface'和'getGenericTypes'方法进行检查,然后使用反射来实际设置值。

 var interf = viewmodelinstance.GetType().GetInterface("IViewModel`1");

 var argType = interf.GetGenericArguments()[0];