【发布时间】:2011-04-07 01:09:11
【问题描述】:
Type 类有一个方法IsAssignableFrom() 几乎可以工作。不幸的是,只有当这两种类型相同或第一种在第二种的层次结构中时,它才会返回 true。它说decimal 不能从int 分配,但我想要一种方法来表明decimals 可以从ints 分配,但ints 并不总是可以从decimal 分配s。编译器知道这一点,但我需要在运行时弄清楚这一点。
这是一个扩展方法的测试。
[Test]
public void DecimalsShouldReallyBeAssignableFromInts()
{
Assert.IsTrue(typeof(decimal).IsReallyAssignableFrom(typeof(int)));
Assert.IsFalse(typeof(int).IsReallyAssignableFrom(typeof(decimal)));
}
有没有办法实现IsReallyAssignableFrom(),它可以像IsAssignableFrom() 一样工作,但也可以通过上面的测试用例?
谢谢!
编辑:
这基本上就是它的使用方式。此示例无法为我编译,因此我必须将 Number 设置为 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表达式或数组创建表达式
【问题讨论】:
-
你会如何处理这些信息?
-
这是框架代码(用于序列化对象)。我有一个要序列化的十进制对象,我想将其默认为 0。不能为其分配 0.0M(编译时失败:不是常量表达式)。想要使用 int 0 并且需要一种方法来验证这是安全的,但不允许使用 DateTime 来默认小数。
-
你能显示不能为你编译的代码吗?
const decimal D = 0.0M在这里编译得很好。 -
@Pavel Minaev:我已经编辑了我的问题以包含一个不适合我编译的示例。
-
啊,是的,属性参数。就 CLR 而言,十进制并不是真正的原始类型,因此在 CLR 级别上不存在十进制文字。对于常量字段,C# 通过使用原始字节来解决这个问题,但它不是属性的选项。从好的方面来说,我相信这只是小数的问题(因为只有它们在 C# 中没有相当文字的文字)。您可以做的是要求类型与除十进制以外的所有内容完全匹配,并专门检查后者的“兼容”原始类型(您事先知道)。