使用反射时如何确定方法是否返回动态类型?

2023-12-24

使用反射时,可以检查字段、属性、索引器和参数的 DynamicAttribute 属性,以确定它们是否具有动态类型。但是,这不适用于方法 - 即使它们返回“动态”,但它们没有属性,并且返回类型是“对象”(并且也没有属性)。 Visual Studio 为外部程序集中的方法执行此操作...可以通过反射来完成吗?

例如,下面的代码会产生以下输出:

dynamicField is dynamic
DynamicProperty is dynamic
Item is dynamic
DynamicMethod is NOT dynamic!!
dynamicParameter is dynamic

示例代码:

using System;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace ReflectDynamics
{
    class Program
    {
        static void Main()
        {
            var test = typeof(Test);
            CheckDynamic(test.GetField("dynamicField"));
            CheckDynamic(test.GetProperty("DynamicProperty"));
            CheckDynamic(test.GetProperty("Item"));
            MethodInfo dynamicMethod = test.GetMethod("DynamicMethod");
            CheckDynamic(dynamicMethod);
            CheckDynamic(dynamicMethod.GetParameters()[0]);
            Console.ReadKey();
        }

        static void CheckDynamic(MemberInfo memberInfo)
        {
            bool isDynamic = memberInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0;
            Console.WriteLine(memberInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!"));
        }
        static void CheckDynamic(ParameterInfo parameterInfo)
        {
            bool isDynamic = parameterInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0;
            Console.WriteLine(parameterInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!"));
        }
    }

    class Test
    {
        public dynamic dynamicField;
        public dynamic DynamicProperty { get { return dynamicField; } }
        public dynamic this[int index] { get { return dynamicField; } }
        public dynamic DynamicMethod(dynamic dynamicParameter) { return dynamicField; }
    }
}

这是因为您需要检查属性ReturnTypeCustomAttributes从方法来看。

修改你的CheckDynamic像这样的方法:

static void CheckDynamic(MemberInfo memberInfo)
{
    bool isDynamic = memberInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0;

    var methodInfo = (memberInfo as MethodInfo);
    if (methodInfo != null)
    {
        isDynamic = methodInfo.ReturnTypeCustomAttributes.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0;
    }

    Console.WriteLine(memberInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!"));
}

这可能需要一些防御性编码,但这只是一个快速而肮脏的概念证明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射时如何确定方法是否返回动态类型? 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • Tensorflow:AttributeError:“NoneType”对象没有属性“original_name_scope”

    我正在尝试在谷歌云上的 debian 9 5 拉伸系统上运行一些 python 张量流代码 我正在使用该版本的tensorflow GPU版本 最新版本 并安装了适当的CODA和cuDNN软件 这是我的代码 import tensorflo
  • Android LibVLC 选项不起作用

    我正在使用 LibVLC 处理流 RTSP 我可以在可以查看流的地方使用它 但延迟设置为默认的约 2 秒 在 Ubuntu 桌面上 我可以使用以下选项启动 vlc 以大大改善延迟 vlc vvv rtsp 192 168 2 1 1234
  • 无法在React应用程序中运行puppeteer,找不到模块:编译时无法解析“ws”

    我想知道是否可以在我的 React 应用程序中运行 puppeteer 每当我尝试在我的 React 应用程序中运行 puppeteer 时 我都会收到 找不到模块 无法解析 ws 我已经尝试安装 ws 但仍然会出现相同的错误 简单的答案
  • XML 架构 (XSD) 中 xsd:union 的用途是什么?

    我出于某种目的正在解析 XSD 但面临一些 XSD 节点的问题 XSD 中 union 的用途是什么以及为什么使用它 它是否用于对 XML 施加某种限制 我正在附加联合和简单类型节点 请解释一下为什么使用它
  • 条形图中每个条形上的叠加线是什么?

    我正在尝试通过数据可视化来学习自己 当我浏览条形图时 我遇到了以下问题 在图表中 条形字符中的每个条形上都有一条垂直的黑线 那条覆盖的黑线到底意味着什么 感谢您的帮助 这个看起来像垂直的误差线 https en wikipedia org
  • 做 Laravel 教程,得到“未找到基表或视图:1146 表‘sdbd_todo.migrations’不存在”

    工作通过本教程 https www flynsarmy com 2013 12 creating a basic todo application with laravel 4 part 1 我执行以下步骤 您现在应该可以根据需要多次调用
  • 您可以从 p:ajax 侦听器更新 h:outputLabel 吗?

    我尝试使用 p ajax 标签 然后在该侦听器中设置一个名为 periodRendered 的值 然后我尝试通过 p ajax 标签的更新来更新 h outputLabel 标签 它没有更新 ajaxily 我认为这是因为 primefac
  • 按钮 ControlTemplate 和圆角

    我有一个按钮控制模板 我想制作带有圆角的按钮 我该怎么做 我尝试使用 CornerRadius 作为边框中的按钮 但它不起作用 按钮的背景已设置为具有角边框的图像 并且按钮看起来很尴尬 因为我无法设置按钮的角 请尝试以下操作
  • Flexbox的align-self属性没有转换?

    我尝试创建一个吗啡 按钮 它可以在另一个菜单上滑动 这个想法是基于 Codrops变形按钮概念 http tympanus net Development ButtonComponentMorph index5 html 现在已经差不多设置
  • 结构体中变量名前的点是什么意思?

    查看linux内核源代码 我发现了这一点 static struct tty operations serial ops open tiny open close tiny close write tiny write write room
  • Python 中循环链表的帮助

    我正在尝试制作一个循环单链表 我希望能够修改我的代码以获得单一喜欢的列表 但我遇到了一些麻烦 对于我的链接列表 我有 class Link object def init self data next None self data data
  • 在运行时获取 RecyclerView 子视图的高度

    我正在尝试制作一个可扩展的 TextView 当用户按下按钮时它会展开 折叠 TextView 和 ImageButton 位于 CardView 中 该 CardView 添加到 RecyclerView 中 展开 折叠效果很好 但现在我
  • ViewPager2 崩溃

    我正在将高级导航组件与 BottomNavigationView 一起使用 In one tab我有ViewPager2 当我第一次单击该选项卡时 效果很好 尽管第二次 来吧 该选项卡应用程序不断崩溃 下面是崩溃日志 我怎样才能解决这个问题
  • 按下后退按钮时提示用户

    哪个是询问用户单击后退按钮时是否要退出应用程序的好地方 我考虑过onPause and onStop 但是只要应用程序落后于其他应用程序 这些方法就会触发 更新 应用程序还应该询问用户是否尝试通过按钮 在应用程序本身中 退出应用程序 而不是
  • 提取第二层嵌套字典中的所有键

    我想提取 2d 字典第二级中的所有键 但 python 解释器返回 NameError 我的预期结果是 aa bb cc aaa bbb ccc gt gt gt adict defaultdict
  • 在c#中如何检查文件是否正在使用? [复制]

    这个问题在这里已经有答案了 如何检查我正在处理的 Excel 文件 操作其数据 删除它或覆盖它 是否正在被另一个程序使用 以及如何从中释放它 请指导我使用 C 尝试用 用于写作 的标志打开 如果失败 该文件将被其他进程 获取 FileStr
  • 使用 JQuery 发布 JSON 并设置 HTTP 内容类型 - 'application /json'

    我正在使用 jquery 将 Json 数据发布到服务器 但是 当我发出如下的帖子请求时 ajax type POST url uri data jsonStrJson contentType application json succes
  • 从剪贴板(从 Excel 粘贴)获取包含重音字符的 CSV 数据

    SCENARIO 我的用户将从 Excel 复制单元格 从而将其放入剪贴板 我的应用程序将从剪贴板检索这些单元格 问题 我的代码从剪贴板检索 CSV 格式 但是 如果原始 Excel 内容包含像 带变音符号的字符 这样的字符 则检索到的 C
  • 如何将对象传递到 Thymeleaf 中的模式对话框?

    我有一个thymeleaf在表中显示数据库内容 人员 的页面 tr td td td td td td td td tr
  • 使用反射时如何确定方法是否返回动态类型?

    使用反射时 可以检查字段 属性 索引器和参数的 DynamicAttribute 属性 以确定它们是否具有动态类型 但是 这不适用于方法 即使它们返回 动态 但它们没有属性 并且返回类型是 对象 并且也没有属性 Visual Studio