如何在MVC3中获取模型的属性名称的字符串表示?

时间:2013-01-04 14:41:00

标签: string asp.net-mvc-3 class variables model

我有以下型号:

Public Class MyModel

    Public Property MyModelId As Integer
    Public Property Description As String
    Public Property AnotherProperty As String

End Class

是否有一种方法可以将Model的属性名称作为字符串表示形式获取,如下面的代码?

Dim propertyName as String = GetPropertyNameAsStringMethod(MyModel.Description)

因此propertyName变量将“Description”作为值。

5 个答案:

答案 0 :(得分:2)

在此SO主题上检查Darin Dimitrov'answer - Reflection - get property name

class Foo
{
    public string Bar { get; set; }
}

class Program
{
    static void Main()
    {
        var result = Get<Foo, string>(x => x.Bar);
        Console.WriteLine(result);
    }

    static string Get<T, TResult>(Expression<Func<T, TResult>> expression)
    {
        var me = expression.Body as MemberExpression;
        if (me != null)
        {
            return me.Member.Name;
        }
        return null;
    }
}

希望这有帮助..

答案 1 :(得分:1)

这是一个可以用于任何属性的辅助扩展方法:

public static class ReflectionExtensions
{
    public static string PropertyName<T>(this T owner, 
        Expression<Func<T, object>> expression) where T : class
    {
        if (owner == null) throw new ArgumentNullException("owner");
        var memberExpression = (MemberExpression)expression.Body;
        return memberExpression.Member.Name;
    }

}

但是,这只适用于类的实例。您可以编写一个类似的扩展方法,直接在该类型上运行。

答案 2 :(得分:1)

你需要使用反射来做。

堆栈溢出已经有很多帖子如下:

How to get current property name via reflection?

Reflection - get property name

Get string name of property using reflection

Reflection - get property name

我相信答案将是:

 string prop = "name"; 
 PropertyInfo pi = myObject.GetType().GetProperty(prop);

答案 3 :(得分:0)

创建扩展方法,然后在需要的地方使用它。

Private Shared Function GetPropertyName(Of T)(exp As Expression(Of Func(Of T))) As String
    Return (DirectCast(exp.Body, MemberExpression).Member).Name
End Function

还要查看this帖子。

答案 4 :(得分:0)

我已经解决了这个问题编辑@ NiranjanKala的源代码示例

像这样转换vb.Net中的代码

<System.Runtime.CompilerServices.Extension()> _
Public Function GetPropertyName(Of T, TResult)(expression As Expression(Of Func(Of T, TResult))) As String
    Dim [me] = TryCast(expression.Body, MemberExpression)
    If [me] IsNot Nothing Then
        Return [me].Member.Name
    End If
    Return Nothing
End Function

然后我可以像这样调用扩展名

Dim propertyName as String = GetPropertyName(Of MyModel, String)(Function(x) x.Description)

然后propertyName变量将“Description”作为字符串值。