是否可以返回类型的对象
IModel< T >
不知道类型参数?
这些对象存储在字典中,其中Type作为键,而对象以
IModel
(IModel<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>