C# 检查 ref 字段自定义属性
C# check for ref field custom attribute
我想检查一个字段的字段自定义属性,该 ref 字段指向。
我有以下代码示例:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
以及以下代码用法:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
我尝试实现 SpecialChangeAttribute。
我有以下想法只是为了让它工作,但没有解决所有情况的解决方案:
- 遍历 class 个字段并使用 ReferenceEquals - 不使用值类型。
- 从 Marshal 获取字段偏移量并与字段指针进行比较 - 无法获取托管类型 T 的地址
有什么想法或提示吗?
我认为您无法为作为参考传递的字段获取自定义属性。反射处理有关代码的静态元数据以及您作为参数在每次调用中发生变化的内容。
你可以做的是向你的 FieldSetter
方法添加额外的参数,它是一个表达式:
FieldSetter<T>(..., Expression<Func<T>> expression);
并这样称呼它:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
这会在您的方法中提供您可以检查的 lambda:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
我想检查一个字段的字段自定义属性,该 ref 字段指向。
我有以下代码示例:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
以及以下代码用法:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
我尝试实现 SpecialChangeAttribute。 我有以下想法只是为了让它工作,但没有解决所有情况的解决方案:
- 遍历 class 个字段并使用 ReferenceEquals - 不使用值类型。
- 从 Marshal 获取字段偏移量并与字段指针进行比较 - 无法获取托管类型 T 的地址
有什么想法或提示吗?
我认为您无法为作为参考传递的字段获取自定义属性。反射处理有关代码的静态元数据以及您作为参数在每次调用中发生变化的内容。
你可以做的是向你的 FieldSetter
方法添加额外的参数,它是一个表达式:
FieldSetter<T>(..., Expression<Func<T>> expression);
并这样称呼它:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
这会在您的方法中提供您可以检查的 lambda:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null