当前位置:  开发笔记 > 编程语言 > 正文

类成员的自定义属性

如何解决《类成员的自定义属性》经验,为你挑选了1个好方法。

我正在使用自定义属性来定义类的成员如何映射到属性以作为表单发布(支付网关)发布.我有自定义属性工作正常,并能够通过"名称"获取属性,但希望成员本身获取属性.

例如:

getFieldName("name");

VS

getFieldName(obj.Name);

计划是编写一个方法,将带有成员的类序列化为一个postable字符串.

这是我此时的测试代码,其中ret是一个字符串,PropertyMapping是自定义属性:

foreach (MemberInfo i in (typeof(CustomClass)).GetMember("Name"))
{
    foreach (object at in i.GetCustomAttributes(true))
    {
        PropertyMapping map = at as PropertyMapping;
        if (map != null)
        {
            ret += map.FieldName;
        }
    }
}

提前致谢!



1> John Leidegr..:

你不能真的这样做,除非你使用的是C#3.0,在这种情况下你需要依赖LINQ(ehm,表达式树).

你所做的是为lambda表达式创建一个虚方法,让编译器生成表达式树(编译器进行类型检查).然后你挖掘那棵树来获得成员.像这样:

static FieldInfo GetField(
    Expression> accessor)
{
    var member = accessor.Body as MemberExpression;
    if (member != null)
    {
        return member.Member as FieldInfo;
    }
    return null; // or throw exception...
}

鉴于以下课程:

class MyClass
{
    public int a;
}

你可以得到这样的元数据:

// get FieldInfo of member 'a' in class 'MyClass'
var f = GetField((MyClass c) => c.a); 

通过引用该字段,您可以按常规方式挖掘任何属性.即反思.

static TAttribute GetAttribute( 
    this MemberInfo member ) where TAttribute: Attribute
{
    return member.GetCustomAttributes( typeof( TAttribute ), false )
        .Cast().FirstOrDefault();
}

现在,您可以通过编译器大量检查的内容在任何字段上挖掘属性.它也适用于重构,如果你重命名'一个'Visual Studio将捕获它.

var attr = GetField((MyClass c) => c.a).GetAttribute();
Console.WriteLine(attr.DisplayName);

那里的代码中没有单个文字字符串.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有