前言:我了解协方差当前不适用于值类型(例如[1],[2])。
我有一个通用类型,可以将其简化如下:
reduce
在不同情况下,类型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()
的值执行Get(context)
函数?不使用反射的荣誉,如果可能的话:D
答案 0 :(得分:2)
也许,您可以添加一个没有泛型的接口,并用它标记一些类:
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();
}
}