【问题标题】:Generic wrapper and isAssignableFrom not working通用包装器和 isAssignableFrom 不起作用
【发布时间】:2010-12-07 16:11:06
【问题描述】:

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

包装器看起来像:

 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 工作正常,因为它只告诉您是否可以直接分配给变量而无需任何类型转换。无论如何修改包装类来解决这个问题?由于 CLR(又名结构)上的原始类型不允许继承,我不知道如何管理它。有什么想法吗?

提前致谢。

【问题讨论】:

    标签: c# generics inheritance struct wrapper


    【解决方案1】:

    正如 SLaks 所指出的,用户定义的转换不能很好地处理这种反射。但是从您的示例中不清楚为什么您需要这样做。如果您只是想测试包装的类型是否可以可能包装未包装的类型,您可以这样做:

    var wrappedUnderlyingType = wrapped.GetType().GetGenericArguments().Single();
    
    if (wrappedUnderlyingType.IsAssignableFrom(unwrapped.GetType()))
    {
       foo();
    }
    

    如果您可以向我们提供更多信息,说明您为什么要执行这种反射,以及如果测试成功,代码应该如何进行,我们可能会提供更多帮助。

    【讨论】:

    • OR 映射器正在检查 IsAssignableFrom 是否可以将数据库中的类型 fund 分配给要填充的对象的每个属性。由于不想从 databasetype / CLR Type 更改 OR 映射器中的映射,我想我可以解决这个问题。
    • @Kolja:在这种情况下,我建议的解决方法是否足够好?
    • 我不会工作,因为即使存在隐式类型转换方法,O/R 映射器涉及设置属性的属性设置器也会抛出参数异常。它似乎在内部检查 IsAssignableFrom。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多