是否可以返回类型的对象

 IModel< T >


不知道类型参数?

这些对象存储在字典中,其中Type作为键,而对象以IModelIModel<T>的基本接口)作为值实现。
接口IModel<T>继承自IModel,但是要执行全部操作,我需要一个IModel<T>对象。 T需要具有接口IFactoryItem

但首先是代码:

    public IModel<T> GetModel<T>() where T : IFactoryItem
    {
         Type tmpType  = typeof(T);
         if (!_allModelsByType.ContainsKey(tmpType))
                return null;

         return (IModel<T>)_allModelsByType[tmpType];
    }


我想到了一个解决方案

公共IModel GetModel(Type t)和一个包装器,将其强制转换为正确的类型。

我希望我不是完全错误的。
这是我的第一个问题。

最佳答案

如果您的问题是如何返回IModel<T>的实例,但是您不知道T在编译时是什么,则仅是它总是从IFactoryItem派生的,则:

如果您在方法输入中未使用T,并且T是一个类,则可以使用协方差:

public interface IModel<out T> where T : class
{
    T Value { get; }
}

public class Model<T> : IModel<T> where T : class
{
    public T Value { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        var foo = new Model<string>()
        {
            Value = "hello world",
        };

        IModel<object> boo = foo;

        Console.WriteLine(boo.Value);
    }
}


这样,您可以绕过IModel<IFactoryItem>而不是IModel<T>

但是,如果您需要值类型,或者不能使用协方差,那么理想情况下,您将(根据您的建议)使用第二个非通用接口IModel,该接口将任何值公开为object

public interface IModel
{
    object Value { get; }
}

public class Model<T> : IModel, IModel<T>
{
    public T Value { get; set; }
    object IModel.Value => Value;
}


如果您的问题是仅在运行时知道类型的情况下如何制作Model<T>的实例,则其:

 var someType = typeof (SomeFactoryItem);
 var instance = Activator.CreateInstance(typeof (Model<>).MakeGenericType(someType));


您仍然需要返回IModel,或者,如果可以使用协方差,则返回IModel<IFactoryItem>

10-05 23:05