是否可以返回一个类型的对象
IModel< T >
不知道类型参数?
对象存储在字典中,以 Type 为键,对象以 IModel
为键。 (IModel<T>
的基本接口(interface))实现为一个值。
界面IModel<T>
继承自 IModel
, 但要执行完整操作,我需要一个 IModel<T>
的对象. T
需要有接口(interface) IFactoryItem
.
但首先是代码:
public IModel<T> GetModel<T>() where T : IFactoryItem
{
Type tmpType = typeof(T);
if (!_allModelsByType.ContainsKey(tmpType))
return null;
return (IModel<T>)_allModelsByType[tmpType];
}
我想到了一个解决方案
public 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>
如果您需要值类型,或者您不能使用协变,那么理想情况下您将拥有(如您所建议的)第二个非通用接口(interface) 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>
关于C# 在运行时返回没有类型参数的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164204/