我有大量的视图模型,每个视图模型都是针对一种特定的对象类型设计的(例如Person,Car等等)。我想为这些添加通用功能,例如能够检查是否已存在包含特定对象(包含特定Car,Person等)的viewmodel。我希望能够动态创建ViewModel(例如,为Car创建viewmodel,为Person创建viewmodel)。所有视图模型都将具有不同的功能,命令等,因此我不能简单地使用一个全局视图模型。是否可以使用接口来解决这个问题,或者这是一个根本上有缺陷的设计模式?
当前代码:
"level":mycat,
"extra":mytimer,
"pid":pid
目前的代码不起作用,因为我无法使用" x作为IViewModel(类型)"。有没有不同的拳击方式' x'以便我可以通过界面访问它?
答案 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];