使用值和引用类型的泛型的协方差解决方法

时间:2018-06-29 06:07:42

标签: c# casting covariance

前言:我了解协方差当前不适用于值类型(例如[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

1 个答案:

答案 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();
    }
}