gpt4 book ai didi

c# - 如何从 PropertyInfo 获取 Getter 支持字段?

转载 作者:太空宇宙 更新时间:2023-11-03 23:12:44 24 4
gpt4 key购买 nike

我有一个类如下:

class Foo : PropertyChangedBase {
private int _property;

public int Property {
get { return _property; }
set { OnAssignPropertyChanged("Property", () => _property, value); }
}

PropertyChangedBase 使用以下方法实现 INotifyPropertyChanged:

    protected void OnAssignmentPropertyChanged<T>(string propertyName, Expression<Func<T>> fieldExpression, T value)
{
var get = fieldExpression.Compile();
if (get().Equals(value))
{
return;
}

// invoke set property method
SetProperty(fieldExpression, value);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

private void SetProperty<T>(Expression<Func<T>> fieldExpression, T value)
{
if (fieldExpression == null)
{
throw new ArgumentNullException(nameof(fieldExpression));
}

var memberExpression = fieldExpression.Body as MemberExpression;
if (memberExpression == null)
{
throw new ArgumentException("fieldExpression");
}

var field = memberExpression.Member as FieldInfo;
if (field == null)
{
throw new ArgumentException("fieldExpression");
}

field.SetValue(this, value);
}

我更愿意调用:

OnAssignPropertyChanged(() => Property, value);

唯一可行的方法是,如果我可以获得属性 getter 的支持字段,然后将其传递给 SetProperty。是否可以通过属性获取方法获取 FieldInfo 或目标成员?

最佳答案

作为一般性回答,是的,至少在受控条件下可以。但唯一应该这样做的情况是,当您绝对确定自己在做什么并且只在有限的支持下时,因为会有您无法处理的情况。

在这里查看答案:Find all property references using reflection .目标有点不同,但查找字段引用的方法相似。由于那里的答案已经包含必要的代码,我将概述要走的路:

.Net 中的所有元数据项都由 token 引用。要获取方法内部使用的标记,您必须解析 MethodBody (通过跳过所有你不会检查的东西)然后 resolve the found tokens in their module .记得使用 BitConverter从流中读取 token 以解析它们时。

但现在到了不利的一面;只有当你找到一个简单的 get 方法时,你才能真正安全地使用它来找到属性 getter 的支持字段,并且具有定义良好的操作码序列,如 Ldfld、Ret 或类似的东西。也许您可以定义 C# 编译器将为简单和自动实现的属性发出的一些模式。如果您发现任何不同之处,则没有其他方法可以退出并抛出异常,因为 getter 可以包含任何代码。与反射一样,仅使用白名单方法,检查您期望的条件并在任何其他情况下抛出异常,否则您迟早会遇到 NullReferenceException。

如果这值得,麻烦由您来决定,但通常您可以从 .Net 2.0 开始这样做,甚至不需要花哨的外部库。

关于c# - 如何从 PropertyInfo 获取 Getter 支持字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38490739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com