c# Mono -属性名称


使用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行为并在我们的模型/视图模型中创建强类型存在时,这很适合我们的团队。

我倾向于避免对属性进行反射,特别是如果您打算多次这样做的话。

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

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

相关内容

  • 没有找到相关文章

最新更新