The Type
类有一个方法IsAssignableFrom()
这几乎有效。不幸的是,只有当两种类型相同或者第一个类型位于第二个类型的层次结构中时,它才会返回 true。它说decimal
不可分配自int
,但我想要一种方法来表明decimal
s 可分配自int
s, but int
s 并不总是可以从decimal
s。编译器知道这一点,但我需要在运行时弄清楚这一点。
这是对扩展方法的测试。
[Test]
public void DecimalsShouldReallyBeAssignableFromInts()
{
Assert.IsTrue(typeof(decimal).IsReallyAssignableFrom(typeof(int)));
Assert.IsFalse(typeof(int).IsReallyAssignableFrom(typeof(decimal)));
}
有没有办法实现IsReallyAssignableFrom()
那会像IsAssignableFrom()
而且还通过了上面的测试用例?
Thanks!
Edit:
这基本上就是它的使用方式。这个例子不适合我编译,所以我必须设置Number
to be 0
(代替0.0M
).
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter)]
public class MyAttribute : Attribute
{
public object Default { get; set; }
}
public class MyClass
{
public MyClass([MyAttribute(Default= 0.0M)] decimal number)
{
Console.WriteLine(number);
}
}
我收到此错误:
错误 4 属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式
其实有three从您正在寻找的意义上来说,一种类型可以“分配”给另一种类型的方式。
类层次结构、接口实现、协变和逆变。这是什么.IsAssignableFrom
已经检查过。 (这还包括允许的拳击操作,例如int
to object
or DateTime
to ValueType
.)
-
用户定义的隐式转换。这就是所有其他答案所指的内容。您可以通过反射检索这些,例如从int
to decimal
是一个静态方法,如下所示:
System.Decimal op_Implicit(Int32)
您只需要检查两个相关类型(在本例中,Int32
and Decimal
);如果转换不在其中,则它不存在。
内置隐式转换定义在C#语言规范 http://www.ecma-international.org/publications/standards/Ecma-334.htm.不幸的是,Reflection 没有显示这些。您必须在规范中找到它们,并将可分配性规则手动复制到您的代码中。这包括数字转换,例如int
to long
也float
to double
、指针转换、可为 null 的转换 (int
to int?
), and 转化次数提升 http://blogs.msdn.com/b/ericlippert/archive/2007/06/27/what-exactly-does-lifted-mean.aspx.
此外,用户定义的隐式转换可以与内置隐式转换链接。例如,如果存在用户定义的隐式转换int
到某种类型T
,那么它也可以兼作从short
to T
。相似地,T
to short
兼作T
to int
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)