[英]Covariance workaround for generic using both value and reference types
前言:我理解协方差目前不适用于值类型(cf [1] , [2] )。
我有一个泛型类型,可以简化如下:
public interface IDynamicValue<out T>
{
T Get(Context context);
}
public abstract class DynamicValue<T> : IDynamicValue<T>
{
public abstract T Get(Context context);
}
类型T
在不同情况下用作参考和值类型。
现在我遇到了以下情况:
public class SomeClass
{
public object thing;
public string ObjectToString(Context context)
{
if (thing is IDynamicValue<object>)
{
return (thing as IDynamicValue<object>).Get(context).ToString();
}
return thing.ToString();
}
}
感谢协方差,如果我将DynamicValue<string>
作为对象传递,那么它将成功转换为IDynamicValue<object>
并且将执行Get
函数。
但是,如果我传递一个DynamicValue<int>
,它将不会被转换(如上所述,我理解为什么会发生这种情况),并且将返回o.ToString()
。
有什么解决方法可以让我在这种情况下对引用值和值类型的DynamicValues
执行Get(context)
函数? 如果可能的话,不要使用反射的荣誉:D
也许,你可以添加一个没有泛型的接口,并用它标记一些类:
public interface IDynamicValue
{
object Get(Context context);
}
public interface IDynamicValue<out T>
{
T Get(Context context);
}
并检查:
public class SomeClass
{
public object thing;
public string ObjectToString(Context context)
{
if (thing is IDynamicValue<object>)
{
return (thing as IDynamicValue<object>).Get(context).ToString();
}
if (thing is IDynamicValue)
{
return (thing as IDynamicValue).Get(context).ToString();
}
return thing.ToString();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.