C#检查参考字段自定义属性

卡米尔·科瓦列夫斯基(Kamil Kowalewski)

我想检查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。为了使它起作用,我有以下想法,但是没有解决方案可以解决所有情况:

  • 遍历类字段并使用ReferenceEquals-不适用于值类型。
  • 从元帅获取字段偏移量并与字段指针进行比较-无法获取托管类型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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章