动态创建附加属性

2023-12-02

尝试重构一个乏味的解决方案,我来到了杰出的动态创建附加属性的想法基本上是:

void SomeMethod()
{
    ...
    var dp = DependencyProperty.RegisterAttached("SomeUniqueOrGeneratedName333", typeof(object), typeof(CurrentClass));
    ...
}

它不是受到推崇的 way.

我正在使用这样的属性(很惊讶,就像有人将附加属性用于其他东西一样)作为与对象数据相关的某些属性(即绑定)的存储。这些稍后在相同方法的 lambda 中检索(不知道它是如何调用的,closure我能想到的最接近的词),例如:

// create attached property an store binding to retrieve result later
var dp = DependencyProperty.RegisterAttached("LolBinding", typeof(object), typeof(CurrentClass));
BindingOperations.SetBinding(obj, dp, someBinding);
// another ap and binding, this time with event (will trigger when DataContext for obj is set)
BindingOperations.SetBinding(obj, DependencyProperty.RegisterAttached("LolAnotherBinding", typeof(object), typeof(CurrentClass), new PropertyMetadata(null, (d, e) =>
{
     var value = obj.GetValue(dp); // accessing ap 
     if (value != null) { ... } // do something
})), Property);

这有效。我可以附加任意数量的属性:

for(int i = 0; i < 10000; i++)
    DependencyProperty.RegisterAttached("SomeName" + i, typeof(object), typeof(MainWindow));

但它有问题,因为不可能检索依赖属性 (nor 通过反射)。我猜 (随意发现)这是因为那些是不是类型的静态成员.

这是我的问题:是吗?OK这样做吗?

我担心的是内存(即泄漏)和性能。如果确认没问题,我可能会开始大量使用这种技术。

可能听起来像是基于意见,但我怀疑是否能够单独正确地测试这一点。


编辑,这里是 mcve 创建和检索此类属性:

// put this into window constructor
var dp = DependencyProperty.RegisterAttached("SomeName", typeof(object), typeof(MainWindow));
SetValue(dp, "test"); // even trying to set value
// trying to access it by name
var a = DependencyPropertyDescriptor.FromName("SomeName", typeof(MainWindow), typeof(MainWindow), true);
var b = GetAttachedProperty(this, "SomeName", typeof(MainWindow)); // method from linked question

Both a and b are null。我只能访问dp通过传递引用。

P.S.:尝试创建具有相同名称的依赖属性将会抛出异常。所以应该有一种方法可以访问它。


我现在明白你的意思了。是的,DependencyPropertyDescriptor.FromName对您的情况没有帮助,因为您没有在目标类型上定义 GetValue 和 SetValue 方法。然而,有一种方法可以通过一些反射通过名称获取依赖属性。需要反思,因为这个有用的方法(DependencyProperty.FromName)由于某种奇怪的原因是内部的:

// put this into window constructor
var dp = DependencyProperty.RegisterAttached("SomeName", typeof(object), typeof(MainWindow));
SetValue(dp, "test"); // even trying to set value                      
// do this only once per application
var fromNameMethod = typeof(DependencyProperty).GetMethod("FromName", BindingFlags.Static | BindingFlags.NonPublic);
var fromName = (Func<string, Type, DependencyProperty>) fromNameMethod.CreateDelegate(typeof(Func<string, Type, DependencyProperty>));
// now it's fast to call this method via delegate, almost 0 reflection costs
var a = fromName("SomeName", typeof(MainWindow));
var value = GetValue(a); // "test"

至于用起来可以吗。当然,这可能不是附加属性的预期用途,但我认为这没有问题。依赖属性值存储在对象本身中,而不是存储在某个静态位置中,因此一旦对象本身被收集,它们就会被收集。当然,附加属性本身在您注册后不会被收集,但这应该不是问题,除非您注册太多。

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

动态创建附加属性 的相关文章

  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 类型“Key”不能用于索引类型“Object”

    尝试用声音类型实现功能性的拨动 但我做错了一些事情 function pluck key Key o Object gt Object Key return object gt object key TS错误 类型 Key 不能用于索引类型
  • 在 jquery ajax 中从 JS 端的 JsonResult 获取属性

    我返回以下对象 JsonResult return new JsonResult Data new ErrorMessage message ContentEncoding System Text Encoding UTF8 JsonReq
  • Powershell 无法从命令提示符创建 Outlook COM 对象

    我有一个用于从命令提示符通过 Microsoft Outlook 发送邮件的脚本 如果我从 PowerShell 或 ISE 控制台内部运行它 则效果很好 但是 当我尝试从经典 Windows 命令提示符 cmd exe 执行相同操作时 即
  • 在文本小部件中搜索单词/字母 (tkinter)

    我将如何添加在文本小部件中搜索文本的搜索功能 根据用户输入进行搜索 def openFile global text artiststxt tkinter Tk artiststxt title Artists artiststxt geo
  • Python xlwt - 使列只读(单元格保护)

    有没有办法在 python xlwt 中使特定单元格只读 写保护 我知道有一个 cell overwrite ok 标志 它不允许覆盖单元格 所有单元格 的内容 但这可以逐个单元格地完成 谢谢 太阳 Excel 单元格有一个locked默认
  • 如果两个单独的进程不使用多处理队列,则内存使用

    我的 python 程序中有一个线程 它从网络摄像头获取图像并将它们放入多处理队列中 然后 一个单独的进程从队列中取出这些图像并进行一些处理 但是 如果我尝试从图像采集 生产者 线程清空队列 则不会释放任何内存 并且该程序最终会使用所有可用
  • 在我的 asp.net mvc 5 Web 应用程序中处理 http 错误的推荐方法

    我需要一种方法来全局处理我的 asp net mvc Web 应用程序中的 http 错误 如果对操作方法的调用是 Ajax 我执行了以下操作 document ready function document ajaxError funct
  • Binding.scala:避免过多 dom 树更新的策略

    在我的项目中scala 适配器我显示通过网络套接字发送的日志条目 由于我无法控制发送的条目数量 因此我正在寻找一种策略来避免屏幕冻结 我创建了一个 ScalaFiddle 来模拟 https scalafiddle io sf kzr28t
  • 小部件边距未应用于带有 TouchWiz 启动器的 ICS 手机?

    我有一个带有小部件的应用程序 我知道 Android 4 0 或更高版本会自动在小部件周围创建边距 因此我已实施了以下建议此开发者 API 页面使小部件在不同的 Android 版本上大小大致相同 我已经在 API 10 14 和 15 上
  • 在开发人员计算机上自动创建没有 DefaultServices 的服务

    在最近的 Service Fabric 社区问答第 24 版中 有很多关于在 Service Fabric 中使用 DefaultService 构造的讨论 ApplicationManifest xml以及它的缺点 Microsoft 建
  • Java:为什么这段代码不起作用?无限循环?

    因此 正如您可能从我的尝试中看出的那样 我试图弄清楚如何制作一个程序 让用户有 5 秒钟的时间输入一些文本行 然后扫描仪将计算输入的行数 我刚刚开始学习 Java 作为我的第二语言 所以请尝试尽可能简单地解释一切 关于为什么它不起作用我有两
  • 页面刷新视图 jsFiddle 后使用 cookie.js 保持 div 上的切换状态

    我有一个简单的代码 它允许我在两个 div 之间切换 这两个 div 是两个子导航的包装 sub nav wrap 是替代导航 它们固定在浏览器的底部 function button click function sub nav wrapm
  • 如何在 php / HTML 中显示数学方程? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我有一个 ckeditor 当我从数据库中获取方程时 我们可以创建数学方程 它看起来像a b2但我想要像 a b 2 那么 我该怎么做呢 请帮我 html entity decode po
  • CSS body 元素宽度不起作用

    HTML p Some content p CSS body margin 0 auto width 470px background color cyan https jsfiddle net tsLu98tL 为什么它没有一直居中 为什
  • RDLC 报告:将过滤器应用于报告

    我有两个参数dateFrom and dateTo我想根据这些值过滤我的报告并显示总和total报告中筛选行的列 目前当我使用表达式时 Sum total 它返回数据库中整列的总和 并且不对表达式应用日期过滤器 问题 如何应用日期之间的总和
  • 在Python中使用数组加载数据

    txt 文件中有这样格式的数据 UserId WordID 1 20 1 30 1 40 2 25 2 16 3 56 3 44 3 12 我正在寻找什么 一些可以为每个用户 ID 提供结果分组的函数 创建一个 wordid 列表 20 3
  • Pandas 中奇怪的条形图对齐方式

    我使用以下命令在 pandas 中生成条形图 其中 x 是现有的 DataFrame df x groupby pAlt describe win stay unstack df se df std np sqrt df count cal
  • OnTouch Listener 不更改位图位置

    我有一个 板 java 类 这是一项活动 也是一个 MySurfaceView java 这是一个 SurfaceView 我正在 SurfaceView 上绘制一些位图 我想在触摸屏幕时移动它 到触摸的位置 它绘制了位图 但触摸后没有任何
  • 查找参数包的唯一值的数量

    给定一个带有可变参数的参数包 如何找到包中唯一值的数量 我正在寻找类似的东西 no of uniques lt 0 1 2 1 2 2 gt value should return 3 我的基本实现看起来像这样 template
  • 动态创建附加属性

    尝试重构一个乏味的解决方案 我来到了杰出的动态创建附加属性的想法基本上是 void SomeMethod var dp DependencyProperty RegisterAttached SomeUniqueOrGeneratedNam