加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何检查C#中运行时类型的可分配性?

发布时间:2020-12-15 17:48:45 所属栏目:百科 来源:网络整理
导读:Type类有一个方法IsAssignableFrom()几乎可以工作.不幸的是,如果两个类型相同或第一个在第二个类型的层次结构中,它将返回true.它表示十进制不能从int中分配,但是我想要一个方法,指示小数可以从ints分配,但int并不总是可以从小数分配.编译器知道这一点,但是我
Type类有一个方法IsAssignableFrom()几乎可以工作.不幸的是,如果两个类型相同或第一个在第二个类型的层次结构中,它将返回true.它表示十进制不能从int中分配,但是我想要一个方法,指示小数可以从ints分配,但int并不总是可以从小数分配.编译器知道这一点,但是我需要在运行时把它弄清楚.

这是一个扩展方法的测试.

[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表达式或数组创建表达式的属性参数类型

解决方法

实际上,您正在寻找的意义上,实际上有三种方式可以将类型“可分配”给另一种.

类层次结构,接口实现,协方差和逆向.这是什么.IsAssignableFrom已经检查. (这也包括允许的拳击操作,例如int对象或DateTime到ValueType.)
>用户定义的隐式转换.这就是所有其他答案是指的.您可以通过Reflection检索这些内容,例如从int到decimal的隐式转换是一个静态方法,如下所示:

System.Decimal op_Implicit(Int32)

您只需要检查两种相关类型(在这种情况下,Int32和Decimal);如果转换不在那些,那么它不存在.
>内置隐式转换,在C# language specification中定义.不幸的是,反射不显示这些.您将必须在规范中找到它们,并将可分配性规则手动复制到代码中.这包括数字转换,例如int还有float到double,指针转换,可空转换(int to int?)和lifted conversions.

此外,用户定义的隐式转换可以使用内置的隐式转换来链接.例如,如果用户定义的隐式转换从int到某种类型T存在,那么它也可以作为从短到T的转换.同样,T到短的两倍也可以是T到int.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读