Use*_*123 2 c# generics interface
我有大量的视图模型,每个视图模型都是针对一种特定的对象类型设计的(例如Person,Car,等等).我想为这些添加通用功能,例如检查是否已存在包含特定对象(包含特定Car,Person等)的viewmodel的功能.我希望能够动态创建ViewModels(例如,为Car创建viewmodel,为Person创建viewmodel).所有视图模型都将具有不同的功能,命令等,因此我不能简单地使用一个全局视图模型.是否可以使用接口来解决这个问题,或者这是一个根本上有缺陷的设计模式?
当前代码:
namespace DummyNameSpace
{
public interface IViewModel<T>
{
T DataModelObject { get; set; }
string Name { get; set; }
}
public class SomeDataModelObject
{
public string SomeProperty { get; set; }
}
public class ViewModelInstance : IViewModel<SomeDataModelObject> //There will be various ViewModels that implement IViewModel, all with different 'T' types.
{
//Some properties, commands, etc.
}
public class TheMainViewModel //won't implement IViewModel, as this will be used to control all the various other viewmodels.
{
public void MethodBeingCalled(object viewmodelinstance)
{
Type type = viewmodelinstance.GetType();
var x = (viewmodelinstance as IViewModel<type>).DataModelObject = null; //Will do other things here.
}
}
}
Run Code Online (Sandbox Code Playgroud)
当前代码不起作用,因为我不能使用"x作为IViewModel(类型)".拳击'x'有不同的方式,以便我可以通过界面访问它吗?
您不能将Type实例用作通用参数 - 它必须是编译时类型.
改变你的MethodToBeCalled喜好:
public void MethodBeingCalled<T>(IViewModel<T> viewModelInstance)
{
var x = viewModelInstance.DataModelObject;
}
Run Code Online (Sandbox Code Playgroud)
通常,泛型倾向于通过代码库传播.虽然动态泛型调度是可能的,但它总是涉及反射 - 这通常是完全没有必要的.