Box C#对象作为通用接口

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'有不同的方式,以便我可以通过界面访问它吗?

Lua*_*aan 5

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

改变你的MethodToBeCalled喜好:

public void MethodBeingCalled<T>(IViewModel<T> viewModelInstance)
{
    var x = viewModelInstance.DataModelObject;
}
Run Code Online (Sandbox Code Playgroud)

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