通用包装器和isAssignableFrom不工作

时间:2010-12-07 16:11:07

标签: c# generics inheritance struct wrapper

我正在尝试创建一个包含所有类型值的通用包装器,以提供一些额外的功能。

包装器看起来像:

 class PropertyWrapper<T>
{
    private T _value;

    public PropertyWrapper(T value)
    {
        _value = value;
    }

    public PropertyWrapper()
    {
    }

    public static implicit operator T(PropertyWrapper<T> value)
    {
        return value._value;
    }

    public static implicit operator PropertyWrapper<T>(T value)
    {
        return new PropertyWrapper<T>(value);
    }

}

它具有隐式转换器运算符,因此程序员可以像处理包装类型一样使用它。

现在我有以下代码:

        PropertyWrapper<Int32> wrapped = new PropertyWrapper<Int32>();
        Int32 unwrapped;

        unwrapped = 42;

        wrapped = unwrapped; //working

        wrapped = 21; //working

        unwrapped = wrapped; //working

        if (wrapped.GetType().IsAssignableFrom(unwrapped.GetType())) //will return false.
        {
            foo();
        }

现在我看到函数IsAssignableFrom工作正常,因为它只告诉您是否可以直接分配给变量而不进行任何类型转换。反正有没有修改Wrapper类来解决这个问题?由于CLR(aka struct)上的原始类型不允许继承,我不知道如何管理它。有什么想法?

先谢谢。

2 个答案:

答案 0 :(得分:1)

用户定义的强制转换运算符是具有特殊名称的常规静态方法 与C#编译器不同,CLR不会对它们产生任何意义。

我认为你不能做到这一点 您可以尝试this trick,但我不确定它是否有效。

答案 1 :(得分:1)

正如SLaks所指出的那样,用户定义的转换不适合这种反射。但是从你的样本为什么你需要这样做是不明确的。如果您只想测试包装类型是否可能包装未包装类型,您可以这样做:

var wrappedUnderlyingType = wrapped.GetType().GetGenericArguments().Single();

if (wrappedUnderlyingType.IsAssignableFrom(unwrapped.GetType()))
{
   foo();
}

如果您可以向我们提供有关您希望执行此类反射的原因的更多信息,以及如果测试成功,代码应如何继续,我们可能会提供更多帮助。