繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM