如何通过反射引用字段

2024-03-28

抱歉,标题不明确。

进一步回答我之前的问题 https://stackoverflow.com/questions/4315905/how-to-pass-parameters-to-a-method-by-reflection,我想订阅动态检索的事件对象的方法(通过反射)。有问题的对象是 Control 的一个字段:

public void SubscribeEvents(Control control)
{
    Type controlType = control.GetType();
    FieldInfo[] fields = controlType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    MethodInfo method = typeof(Trace).GetMethod("WriteTrace");

    // "button1" hardcoded for the sample
    FieldInfo f = controlType.GetField("button1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    // "Click" hardcoded for the sample
    EventInfo eInfo = f.FieldType.GetEvent("Click");

    if (eInfo != null)
    {
        EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eInfo.Name);
        Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method);
        eInfo.AddEventHandler(?????, realDelegate); // How can I reference the variable button1 ???
    }
}

我不知道如何引用变量“button1”。我尝试过这样的事情:

public void SubscribeEvents(Control control)
{
    Type controlType = control.GetType();
    FieldInfo[] fields = controlType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    MethodInfo method = typeof(Trace).GetMethod("WriteTrace");

    // "button1" hardcoded for the sample
    FieldInfo f = controlType.GetField("button1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    // "Click" hardcoded for the sample
    EventInfo eInfo = f.FieldType.GetEvent("Click");

    Type t = f.FieldType;
    object o = Activator.CreateInstance(t);

    f.GetValue(o);

    if (eInfo != null)
    {
        EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eInfo.Name);
        Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method);
        eInfo.AddEventHandler(o, realDelegate); // Why can I refer to the variable button1 ???
    }
}

但我这里有一个例外:

        f.GetValue(o);

System.ArgumentException 未处理 Message=在类型“WindowsFormsApplication1.Form1”上定义的字段“button1”不是类型为“System.Windows.Forms.Button”的目标对象上的字段。


那是因为您正在尝试创建一个新实例Button并试图获得其价值button1财产,显然不存在。

替换这个:

Type t = f.FieldType;
object o = Activator.CreateInstance(t);

f.GetValue(o);

有了这个:

object o = f.GetValue(control);

您可以使用这样的方法来获取任何对象的字段值:

public static T GetFieldValue<T>(object obj, string fieldName)
{
    if (obj == null)
        throw new ArgumentNullException("obj");

    var field = obj.GetType().GetField(fieldName, BindingFlags.Public |
                                                  BindingFlags.NonPublic |
                                                  BindingFlags.Instance);

    if (field == null)
        throw new ArgumentException("fieldName", "No such field was found.");

    if (!typeof(T).IsAssignableFrom(field.FieldType))
        throw new InvalidOperationException("Field type and requested type are not compatible.");

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

如何通过反射引用字段 的相关文章

  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • NET/COM 互操作的 ref string[] 内存泄漏

    我最近发现一个非常奇怪的 对我来说 内存泄漏IEnumString http msdn microsoft com en us library ms693735 28VS 85 29 aspxC 使用的 COM 对象 具体来说 使用已包含先
  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

    我最近需要使用GC 添加内存压力 http msdn microsoft com en us library system gc addmemorypressure aspx令我感到奇怪的是 它不接受添加内存压力的对象作为参数 我认为因为它
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • Windows 服务:错误 5:访问被拒绝

    我正在尝试创建一个简单的 Windows 服务 该服务的用户帐户是NetworkService 然后我跑了installUtil从命令提示符我得到了这个 提交阶段完成 成功地 事务安装已完成 这意味着服务已成功安装 但是当我尝试从Servi
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • 禁止/阻止选择 wpf 中禁用的组合框项目

    我正在编写一个应用程序 其中我想禁用其中的一些项目ComboBox并且还想禁止 阻止选择禁用的项目 请注意ComboBox在主窗口中有另一个 ComboBox 作为 ComboBox Item init 在运行时由DataTemplateS
  • Rfc2898DeriveBytes 与密码的 Sha2 哈希生成

    我最近知道使用 SHA256 为加盐密码生成密码哈希 在阅读了一些有关加盐密码和安全性的内容后 我看到rfc2898derivebytes and passwordderivebytes NET 中的类 使用有什么好处吗rfc2898der
  • 在源代码管理中管理我的数据库

    由于我正在处理一个新的数据库项目 在 VS2008 中 而且我从未从头开始开发数据库 因此我立即开始研究如何在源代码管理 在本例中为 Subversion 中管理数据库 我找到了一些关于SO的信息 包括这篇文章 保持多个环境中的开发数据库同
  • 登录方式使用GINA定制

    我知道在 GINA 中找到大师并不容易 但我的问题最接近进程间通信 IPC 我用非托管 c 编写了我的自定义 GINA 我在其中包含了一个方法来检查用户尝试的指纹的有效性为了登录 该函数将调用正在运行的系统Windows服务中用C 编写的一
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • 两个 C# 扩展泛型方法之间的不明确调用,其中一个 where T:class 和另一个 where T:struct

    考虑两种扩展方法 public static T MyExtension
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • .Net Core appsettings.json 最佳实践 - 覆盖开发设置(或反之亦然)?

    寻找一种关于在 Net Core 中构造 appsettings json 文件的合理方法 是否应该将基本 appsettings json 文件配置为在开发环境中运行 然后基于环境的覆盖 例如 appsettings Production

随机推荐

  • .htaccess 用于 HTML5 模式的 AngularJS 应用程序的子文件夹

    概述 我有一个 AngularJS 应用程序 它使用 locationProvider html5Mode true 它由 Apache 服务器提供 到目前为止 我使用的源代码是从其他人那里访问的 我只需要重定向到 index html 以
  • 为什么 EnumerateFiles 比计算大小快得多

    对于我的 WPF 项目 我必须计算单个目录 可能有子目录 中的总文件大小 Sample 1 DirectoryInfo di new DirectoryInfo path var totalLength di EnumerateFiles
  • Android 中如何获取当前 Button 文本颜色?

    我不知道如何获取按钮文本的当前颜色 我知道可能是这样 但无法完全弄清楚参数 public static int getTextColor Context context TypedArray attrs int def 基本上我正在尝试这样
  • 渲染问题无法加载LayoutLib:

    渲染问题无法加载LayoutLib com android layoutlib bridge Bridge 详情 org jetbrains android uipreview RenderingException Failed to lo
  • 在 xml 编辑器中在字符串资源的引用和值预览之间切换

    在 Android Studio 中使用 xml 值并引用时 Strings xy例如 我在视频中看到 实际上可以直接在同一编辑器窗口中显示实际值 它是基本上是在之间切换 String xy和 XYContent 但引用仍然存在 我不是指
  • 在服务器上强制 svn:eol-style=native?

    目前 为了保证颠覆性eol style被设定为native对于添加到项目中的每个新文件 我们必须将其添加到 subversion config我们每台开发人员机器上的文件 miscellany enable auto props yes a
  • c# Xamarin UITextField 设置光标位置

    我需要将 UITextField 的光标定位在与另一个先前文本字段完全相同的位置 我将光标在第一个文本字段中的位置设为nint index txtToField GetOffsetFromPosition txtToField Beginn
  • Android 时差与乔达时间

    我有这个简单的代码 使用 Joda time 工作正常 但我有一个问题 比如返回814分钟 通过代码就可以了 但我希望结果少于 60 分钟 而不是 814 分钟 那么 我该如何转换这 814 分钟才能得到我想要的结果呢 同样的情况也发生在几
  • YouTube Live API 流状态和质量回调

    In the Live Control Room of a YouTube Live broadcast I can see a Stream Status view which shows me details of the video
  • 尝试上传到 Amazon S3 时出现“不支持的正文有效负载对象”

    我想将文件从我的前端上传到我的 Amazon S3 AWS 我正在使用 dropzone 因此我转换文件并将其发送到我的后端 在我的后端我的文件是这样的 fieldname file originalname test torrent en
  • 从 Mono 列表创建 Flux 的正确方法

    假设我有一个使用 CustomObjects 列表的 API 操作 对于其中的每一个对象 它都会调用一个创建 Mono 的服务方法 如何以惯用且非阻塞的方式从这些 Mono 对象创建 Flux 我现在想到的就是这个 我更改了方法名称以更好地
  • 如何在 Telegram API 中转发消息

    Telegram API 中有 2 种转发消息的方法 messages forwardMessage messages forwardMessages 我想用forwardMessage转发消息的方法channel group or use
  • 修复了 div 内的非滚动页脚?

    我正在页面中央制作一个小 div 它有一个固定的页脚 但该 div 是可滚动的 根据我的说法 有两种方法可以做到这一点 Using position fixed 固定位置实际上是相对于浏览器窗口起作用的 但我想要相对于我的小 div 的位置
  • 如何测试一个字符串是否包含多个子字符串之一?

    我想知道一个字符串是否包含以下之一abc def xyz等等 我可以这样做 a Contains abc or a Contains def or a Contains xyz 好吧 它可以工作 但是如果这个子字符串列表发生变化 我必须更改
  • 如何在 mvc3 razor 视图中使用会话变量保留数据?

    我正在使用 Razor 开发 MVC3 应用程序 在验证用户后 在我的帐户控制器中 我从数据库获取用户 ClientID 这里我想将 ClientID 保留在 Session 变量中 它在所有控制器和 Razor 视图中使用 我不知道实现此
  • 在Java中删除文件的内容

    我正在将字节写入 temp fls 文件 完成操作后 我想从 temp fls 文件中删除最后 256 个字节 我怎样才能实现这个目标 请帮我 提前致谢 Use RandomAccessFile setLength http java su
  • 如何在 Ansible 中的 do-until 循环中指定多个条件

    我正在拨打 REST 电话 并想在继续之前检查我的请求是否已完成 在响应中 我收到 PENDING 或 IN PROGRESS 作为 request status 我想等到我得到 完成 或 失败 为此 我想在收到 PENDING 或 IN
  • 如何分析由忽略的ExceptionInInitializerError引起的NoClassDefFoundError?

    今天我花了一个下午的时间来分析 NoClassDefFoundError 一次又一次验证类路径后 发现有一个类的静态成员抛出了第一次被忽略的异常 之后 每次使用该类都会抛出 NoClassDefFoundError 而没有有意义的堆栈跟踪
  • Azure Blob 存储在 Microsoft 中时是否已加密?

    我正在开发一个在 Azure Blob 存储中存储文本的网站 文本可能很敏感 不一定是密码 而是个人信息 我正在尝试决定是否应该在将文本存储到 Azure Blob 存储之前对其进行加密 我的理解是 如果 Azure 密钥和帐户名泄露并且恶
  • 如何通过反射引用字段

    抱歉 标题不明确 进一步回答我之前的问题 https stackoverflow com questions 4315905 how to pass parameters to a method by reflection 我想订阅动态检索