我需要一个适用于任何.Net数据类型的公共类/接口

Ver*_*rax 1 .net c#

我正在寻找一种方法来一致地处理所有.Net数据类型,所以我可以在下面创建任何类型实现IGetValue<out T>将转换为的模式IGetValue<object>.出于某种原因,如果T是a struct,它不起作用,我不明白为什么.有没有办法可以实现以下模式?

public interface IGetValue<out T>
{
    T Value
    {
        get;
    }
}

public class GetValue<T> : IGetValue<T>
{
    public GetValue(T value)
    {
        _value = value;
    }

    private T _value;
    public T Value
    {
        get { return _value; }
    }
}


class Program
{
    static void Main(string[] args)
    {
        IGetValue<string> GetString = new GetValue<string>("Hello");
        IGetValue<int> GetInt = new GetValue<int>(21);

        //This works!!!
        if (GetString is IGetValue<object>)
        {
            Console.WriteLine("GetValue<string> is an IGetValue<object>");
        }
        else
        {
            Console.WriteLine("GetValue<string> is not an IGetValue<object>");
        }

        //This doesn't work!!! Why????
        if (GetInt is IGetValue<object>)
        {
            Console.WriteLine("GetValue<int> is an IGetValue<object>");
        }
        else
        {
            Console.WriteLine("GetValue<int> is not an IGetValue<object>");
        }

        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我意识到我在这里想要完成的事情看起来很模糊,但这是一个更大设计的一部分,其解释过于冗长.我需要的是让我所有的IGetValue<T>s与一个名为"Value"的属性共享一个公共类型或接口,返回一个object.为什么是冗长的部分.

Jon*_*eet 8

它不起作用,因为泛型方差不适用于值类型......它们具有不同的表示形式,而参考类型的方差可以在CLR不必执行任何转换的情况下发生.

因此,例如,您可以将a IEnumerable<string>视为一个IEnumerable<object>,但不能将其IEnumerable<int>视为一个IEnumerable<object>.