c# - C# 检查 ref 字段自定义属性
问题描述
我想检查一个字段的字段自定义属性,该 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 的地址
有什么想法或提示吗?
解决方案
我认为您无法为作为 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
推荐阅读
- python - 异常值如何处理和替换
- react-native - 为什么我的图像没有在 React Native 中显示
- ios - 给定具有任何pointSize的UIFont,如何计算适当的笔划宽度?
- go - 对 golang 项目布局 repo 在实践中的工作方式感到困惑
- javascript - 如何从我的网站获取访问者位置(Javascript 或 PHP)
- javascript - 当另一个实例设置为true时,如何将组件的一个复选框实例设置为false?
- regex - 将字符串格式化为 XML 文件
- javascript - 运行 Electron 包应用程序时出现黑屏 - 如何调试?
- graph-theory - 使用 janusgraph 构建快速查询
- python - 如何仅获取numpy数组中一项的坐标