我正在尝试创建一个包含所有类型值的通用包装器,以提供一些额外的功能。
包装器看起来像:
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)上的原始类型不允许继承,我不知道如何管理它。有什么想法?
先谢谢。
答案 0 :(得分:1)
用户定义的强制转换运算符是具有特殊名称的常规静态方法 与C#编译器不同,CLR不会对它们产生任何意义。
我认为你不能做到这一点 您可以尝试this trick,但我不确定它是否有效。
答案 1 :(得分:1)
正如SLaks所指出的那样,用户定义的转换不适合这种反射。但是从你的样本为什么你需要这样做是不明确的。如果您只想测试包装类型是否可能包装未包装类型,您可以这样做:
var wrappedUnderlyingType = wrapped.GetType().GetGenericArguments().Single();
if (wrappedUnderlyingType.IsAssignableFrom(unwrapped.GetType()))
{
foo();
}
如果您可以向我们提供有关您希望执行此类反射的原因的更多信息,以及如果测试成功,代码应如何继续,我们可能会提供更多帮助。