C#单属性名称

C#单属性名称,c#,reflection,mono,xamarin.ios,C#,Reflection,Mono,Xamarin.ios,使用C#和MonoTouch/Mono 我需要得到财产的名称,如下所示: public string BalanceOwing { get { return the-name-of-the-property "BalanceOwing" } } 这里最简单的方法正是您所拥有的-一个基本的文本“余额平衡” 没有infoof操作员。有一些有趣的方法可以在框架内通过表达式树(()=>balancelow)或堆栈框架的分析(MethodInfo.GetCurrentMethod())实现这一点

使用C#和MonoTouch/Mono

我需要得到财产的名称,如下所示:

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

这里最简单的方法正是您所拥有的-一个基本的文本
“余额平衡”

没有
infoof
操作员。有一些有趣的方法可以在框架内通过表达式树(
()=>balancelow
)或堆栈框架的分析(
MethodInfo.GetCurrentMethod()
)实现这一点,但两者都会影响性能。坦率地说,文字更简单、更直接、更快,只要您对其进行单元测试,它就同样可靠


您也可以查看外部工具,例如PostSharp(SharpCrafters),但再次强调:这听起来有些过火。

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

没有
infoof
操作员。有一些有趣的方法可以在框架内通过表达式树(
()=>balancelow
)或堆栈框架的分析(
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;
        }

正如Marc所提到的,存在绩效影响(截至目前为止,我们尚未正式进行基准测试或说明)但是,当使用INotifyPropertyChanged行为并在我们的模型/视图模型中创建强类型显示时,这非常适合我们的团队。

您当然可以创建一个可以提供您所需内容的

        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;
        }

正如Marc所提到的,存在绩效影响(截至目前为止,我们尚未正式进行基准测试或说明)但是,当使用INotifyPropertyChanged行为并在我们的模型/视图模型中创建强类型显示时,这非常适合我们的团队。

我倾向于避免对属性进行反思,尤其是如果您预期会多次这样做

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

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

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

我倾向于避免对属性进行反思,尤其是如果您曾经期望不止一次地这样做

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

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

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

什么?我们需要更多的背景来了解你在做什么。
属性的名称应该是什么意思?您的意思是要使用反射按名称获取属性的值吗?在什么物体上?等等。你到底有什么困难?现在还不清楚你在这里想要实现什么。您希望获取执行当前代码的属性的名称。正确的?!?我确实认为只有使用面向方面的编程(AOP)工具才能做到这一点。什么?我们需要更多的背景来了解你在做什么。
属性的名称应该是什么意思?您的意思是要使用反射按名称获取属性的值吗?在什么物体上?等等。你到底有什么困难?现在还不清楚你在这里想要实现什么。您希望获取执行当前代码的属性的名称。正确的?!?我确实认为,只有使用面向方面的编程(AOP)工具,如。