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

2024-04-01

The Type类有一个方法IsAssignableFrom()这几乎有效。不幸的是,只有当两种类型相同或者第一个类型位于第二个类型的层次结构中时,它才会返回 true。它说decimal不可分配自int,但我想要一种方法来表明decimals 可分配自ints, but ints 并不总是可以从decimals。编译器知道这一点,但我需要在运行时弄清楚这一点。

这是对扩展方法的测试。

[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 longfloat 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(使用前将#替换为@)

如何在 C# 中运行时检查类型的可分配性? 的相关文章

  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 使用单元格按钮操作传递多个参数

    NOTE 我不需要任何关于使用 UITableview 的 didselect 委托发送数据的建议 myButton h import
  • 在 UITableView 中保留占位符单元格

    我有一个 UITableView 我永远不想低于 1 个单元格 它是一个目录读数 如果目录中没有文件 它有一个单元格显示 无文件 在编辑模式下 有一个用于创建文件的奖励单元格 因此编辑模式永远不会低于两个单元格 可能只是睡眠不足让我现在无法
  • 避免在 sweave/pgfsweave 编译期间显示数字

    使用 sweave pgfsweave 进行编译时 每次在 R 中创建图形时 它都会显示在图形窗口中 在 sweave 编译过程中 这在许多情况下很有帮助 因为我可以在编译文档时看到图形的样子 但是当我通过 ssh 编译一个大文档时 这可能
  • Marshal.GenerateGuidForType(Type) 和 Type.GUID 有什么区别?

    Type classType typeof SomeClass bool equal Marshal GenerateGuidForType classType classType GUID 我还没有发现不符合这个条件的案例 So 为什么以
  • 从程序内调用 daemon(0,0) 和在后台启动程序并重定向其输出有区别吗

    在程序 progX 开头使用以下代码有什么区别 if daemon 0 0 1 printf daemon error s strerror errno 或通过以下命令运行 progX progX 2 gt dev null 1 gt de
  • 无法加载 C++/CLI DLL 资源

    我只是想查看资源名称 但什么也没有出现 我在 Visual Studio 2010 中制作并编译了一个 C CLI 托管 DLL 并添加了一些资源文件作为测试 一个图标和一个位图 我已经检查过 PE Explorer 资源肯定在那里 我的简
  • Grails - 按域关系属性排序(使用 createCriteria())

    我有两个具有 1 n 关系的域类 import Action class Task Action actionParent String taskName and class Action String actionName 我有一个任务列
  • 如何获取每个 Kotlin 的当前索引

    如何在foreach循环中获取索引 我想打印每第二次迭代的数字 例如 for value in collection if iteration no 2 do something 在java中 我们有传统的for循环 for int i 0
  • 新的 Clang Objective-C 文字可以重定向到自定义类吗?

    虽然超载 开始踏上危险的领域 我喜欢在 Clang 3 1 中添加新的 Objective C 文字 不幸的是 新的文字对我来说用处有限 除了代码需要与 AppKit 交互的情况外 我大多放弃使用基础类 转而使用我自己的自定义框架 出于多种
  • 在请求正文中发送数组不起作用:使用改造 2.1.0

    将 CustomDishItems 作为数组发送时给出结果 服务器在处理请求时遇到错误 它适用于 CustomDishItems 以下是我使用 PHP Web 服务在服务器上 POST 所需的数据 服务网址 http saavorapi p
  • iPad - 获取纵向和横向屏幕尺寸

    我使用以下代码来获取屏幕尺寸宽度 CGFloat width UIScreen mainScreen bounds size width 100 但其纵向和横向的宽度均为 668 0 如何根据设备的方向获得不同的宽度 我遇到了与您相同的问题
  • SVG - 调整以一定角度放置的矩形的大小

    All 我的应用程序中有一个 SVG 矩形 可以通过拖动矩形两侧的结束栏 左和右 来水平拉伸它 矩形可以是 1 调整大小 通过如上所述拉伸 2 拖动 3 并旋转 一切工作正常 但是 一个奇怪的经历是 当我将矩形旋转到接近 90 度 然后尝试
  • 将 2D Numpy 灰度值数组转换为 PIL 图像

    假设我有一个 2D Numpy 数组 其值范围在 0 到 1 之间 它表示灰度图像 然后如何将其转换为 PIL Image 对象 迄今为止的所有尝试都产生了极其奇怪的分散像素或黑色图像 for x in range image shape
  • 在 Windows Phone 7 中使用 RestSharp

    我正在尝试使用 RestSharp http restsharp org http restsharp org 在 Windows Phone 7 项目中 但我似乎遇到了 RestSharp 使用的 Newtonsoft Json NET
  • 如何从 Visual Studio 2013 中禁用 mscorlib.dll?

    我正在尝试在 Visual Studio 2013 中使用自定义标准库 但似乎无法弄清楚 尽管我希望能够在 IDE 中利用智能感知 但使用 nostdlib 在命令行上进行编译没有任何问题 我已删除除自定义 corelib 之外的所有引用
  • ElasticSearch非法参数异常

    我在 Ubuntu 16 04 上使用 Elasticsearch 最新版本 但在将数据放入其中时遇到了一些问题 这是我的 json 文档 相关部分 products 232CDFDW89ENUXRB sku 232CDFDW89ENUXR
  • 无法通过实例引用访问成员;用类型名称限定它[重复]

    这个问题在这里已经有答案了 今天我正在研究 c Sharp 正在尝试静态类 但它似乎对我不起作用 我很想知道解决方案 我已经在网上浏览了一段时间 但似乎找不到答案 这是我的代码 class Count public static int s
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • OrderBy Linq 的奇怪行为

    我有一个使用以下命令排序的列表OrderBy Linq 函数 返回一个IOrderedEnumerable var testList myList OrderBy obj gt obj ParamName ParamName 是一个可以保存
  • 如何在 C# 中运行时检查类型的可分配性?

    The Type类有一个方法IsAssignableFrom 这几乎有效 不幸的是 只有当两种类型相同或者第一个类型位于第二个类型的层次结构中时 它才会返回 true 它说decimal不可分配自int 但我想要一种方法来表明decimal