繁体   English   中英

C#Mono-属性名称

[英]C# Mono - Property Name

使用C#和MonoTouch / Mono

我需要这样获取属性的名称:

public string BalanceOwing
{
    get { return the-name-of-the-property "BalanceOwing" }
}

这里最简单的方法就是您所拥有的-基本文字"BalanceOwing"

没有infoof运算符。 还有一些有趣的方式与任一表达式树(执行此框架内() => BalanceOwing堆栈帧(的)或分析MethodInfo.GetCurrentMethod()但是两者都具有的性能影响。 坦率地说,只要您进行单元测试,该文字就更简单,更直接,更快,并且同样可靠。

您也可以查看外部工具,例如PostSharp(SharpCrafters),但是再说一遍:在这里听起来有些过分。

您当然可以创建一种可重用的方法 ,该方法将为您提供所需的内容。

        protected String GetPropertyName<TProperty>(Expression<Func<TProperty>> propertyExpresion)
        {
            var property = propertyExpresion.Body as MemberExpression;
            if (property == null || !(property.Member is PropertyInfo) ||
                !IsPropertyOfThis(property))
            {
                throw new ArgumentException(string.Format(
                    CultureInfo.CurrentCulture,
                    "Expression must be of the form 'this.PropertyName'. Invalid expression '{0}'.",
                    propertyExpresion), "propertyExpression");
            }

            return property.Member.Name;
        }

要使用您将传递属性的名称...

String propertyName = GetPropertyName(() => this.BalanceOwing);

正如Marc所提到的,性能影响(目前尚无正式基准测试或记录),但这在使用INotifyPropertyChanged行为并在Models / ViewModels中创建强类型存在时非常适合我们的团队。

我倾向于避免对属性进行反思,特别是如果您希望多次进行反思。

我的一般想法是在属性顶部使用Attribute,然后将结果缓存到某个位置的静态实例中:

[AttributeUsage(AttributeTargets.Property)]
public class FooNameAttribute : Attribute
{
    public string PropertyName { get; private set; }

    public FooNameAttribute(string propertyName)
    {
        PropertyName = propertyName;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM