【问题标题】:C# check for ref field custom attributeC# 检查 ref 字段自定义属性
【发布时间】:2018-11-14 11:06:17
【问题描述】:

我想检查一个字段的字段自定义属性,该 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 - 不适用于值类型。
  • 从 Marshal 获取字段偏移量并与字段指针进行比较 - 无法获取托管类型 T 的地址

有什么想法或提示吗?

【问题讨论】:

  • 你可以检查它是否实现了IEquatable&lt;&gt;IComparable接口
  • 感谢您的回复!不幸的是,比较变量似乎无助于区分具有相同值的两个独立字段,或者我错过了这个想法

标签: c# c#-6.0


【解决方案1】:

我认为您无法为作为 ref 传递的字段获取自定义属性。反射处理关于代码的静态元数据,以及作为参数获得的内容随着调用的变化而变化。

您可以做的是向您的 FieldSetter 方法添加附加参数,该参数是一个表达式:

FieldSetter<T>(..., Expression<Func<T>> expression);

然后这样称呼它:

FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);

这会在您的方法中为您提供可以检查的 lambda:

((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null

【讨论】:

  • 感谢您的解决方案!它需要一些全局更改,但可能是唯一可行的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多