gpt4 book ai didi

c# - 通用包装器和 isAssignableFrom 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:33 27 4
gpt4 key购买 nike

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

包装器看起来像:

 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 上的原始类型(又名结构)不允许继承 self 不知道如何管理它。有什么想法吗?

提前致谢。

最佳答案

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

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

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

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

关于c# - 通用包装器和 isAssignableFrom 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4378805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com