我正在寻找一种将对象转换为简单接口(interface)和派生自简单接口(interface)的通用接口(interface)的方法。
这是我的例子:
interface INonGeneric
{
}
interface IGeneric<T> : INonGeneric where T : ITypeParameter
{
T Build();
}
interface ITypeParameter
{
}
class TypeClass : ITypeParameter
{
}
这就是我尝试使用的设计。如果我对泛型的理解有缺陷(我想确实如此),那么这个错误对你来说是显而易见的。
然后我创建我想使用的类:
class MyClass : MyClassBase<TypeClass>
{
public override TypeClass Build()
{
return new TypeClass();
}
}
abstract class MyClassBase<T> : IGeneric<T> where T : ITypeParameter
{
public abstract T Build();
}
然后我尝试像这样转换它们:
void Main()
{
var myClass = new MyClass();
var cast1 = myClass as INonGeneric;
if(cast1 != null) Console.WriteLine("cast 1 works!"); //THIS WORKS
var cast2 = TestCast<ITypeParameter>(myClass);
if(cast2 != null) Console.WriteLine("cast 2 works!"); //THIS DOES NOT WORK
}
如有任何帮助,我们将不胜感激。
编辑:抱歉,我忘了放入 TestCast 方法。在这里:
IGeneric<T> TestCast<T>(INonGeneric obj) where T : ITypeParameter
{
return obj as IGeneric<T>;
}
最佳答案
由于协方差问题,这不起作用。 考虑这个示例代码。
var liInt = new List<int>() { 1,2,3};
var liObj = List<object>(liInt);
在那之后,您可以认真地向 liObj 添加一些非整数值,显然,这是不可行的。
bool b = false;
liObj.Add(b);
为防止这种情况,您应该隐含地告诉您您仅在返回位置使用您的通用类型,而不是在输入中。例如:
interface IGeneric<out T> : INonGeneric where T : ITypeParameter
更多信息请查看以下链接: http://tomasp.net/blog/variance-explained.aspx/
关于c# - 将简单对象转换为简单通用的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199451/