2010-07-27 36 views
9

Tôi muốn để có được tên của một tài sản, ví dụ:Net Nhận tên thuộc tính

Dim _foo As String 

Public Property Foo as String 
Get 
    Return _foo 
End Get 
Private Set(ByVal value as String) 
    _foo = value 
End Set 

Sub Main() 
    Console.Write(Foo.Name)'Outputs "Foo" 
End Sub 

Bất kỳ ý tưởng như thế nào?

+0

Bạn muốn chuỗi ' "Tên"? – leppie

Trả lời

24

bạn có nghĩa là một tài sản, hoặc làm bạn có nghĩa là một lĩnh vực

có những kỹ thuật lambda thông minh để nhận được tên của bất động sản - đây là một ví dụ C#:

String GetPropertyName<TValue>(Expression<Func<TValue>> propertyId) 
{ 
    return ((MemberExpression)propertyId.Body).Member.Name; 
} 

Gọi nó như thế này:

GetPropertyName(() => MyProperty) 

và nó sẽ trả lại "MyProperty"

Không chắc đó có phải là những gì bạn đang theo dõi hay không.

+0

Thực sự rực rỡ! Cảm ơn bạn. – Ucodia

+0

Sai lầm của tôi là tâm trí của tôi ở một nơi khác khi tôi viết ví dụ. Đã thay đổi nó ngay bây giờ – Drahcir

+1

ví dụ cuộc gọi phải là: MyClass obj = new MyClass(); GetPropertyName (() => obj.MyProperty) –

0

thông qua phản ánh. Sử dụng phương thức GetType() của kiểu, sau đó nhìn vào phương thức GetProperties() và lớp PropertyInfo. (nếu bạn muốn truy xuất chuỗi "propertyName" (đối với trường gọi là propertyName - hãy sử dụng xxx.GetType(). GetFields() [0] .Name nếu đó là trường đầu tiên trong lớp.

+0

Điều này chỉ hoạt động nếu bạn biết chỉ mục của thuộc tính trong lớp, điều này không thực sự đáng tin cậy vì lớp học có thể thay đổi hoặc có thể là một phần. – Ucodia

3
public static PropertyInfo GetPropInfo<T>(this T @object 
    , Expression<Action<T>> propSelector) 
{ 
    MemberExpression exp= propSelector.Body as MemberExpression; 
    return exp.Member as PropertyInfo; 
} 

Sau đó sử dụng nó như thế này:

string str = .... 
string propertyName = str.GetPropInfo(a => a.Length).Name; 

Lưu ý rằng phương pháp trên là một phần mở rộng và cần được viết bằng một lớp tĩnh và sử dụng bằng cách bao gồm các không gian tên

+0

Hoặc trong trường hợp của OP, trong VB nó là một phương pháp mở rộng nên ở trong một Module (không phải lớp tĩnh) và được trang trí với thuộc tính Extension chứ không phải từ khóa này. –

7

Nếu bạn đang sử dụng C# 6.0 (không được phát hành khi câu hỏi này được hỏi) bạn có thể sử dụng nameof(PropertyName) điều này được đánh giá tại thời gian biên dịch và được chuyển đổi thành chuỗi, điều tốt đẹp khi sử dụng nameof() là bạn không phải thay đổi chuỗi theo cách thủ công khi bạn refactor. (nameof công trình trên hơn Properties, CallerMemberName là hạn chế hơn)

Nếu bạn vẫn đang bị mắc kẹt trong pre C# 6.0 thì bạn có thể sử dụng CallerMemberNameAttribute (nó đòi hỏi .net 4,5)

private static string Get([System.Runtime.CompilerServices.CallerMemberName] string name = "") 
{ 
    if (string.IsNullOrEmpty(name)) 
     throw new ArgumentNullException("name"); 
    return name; 
} 
+0

Tôi không lý do tại sao điều này không được đánh giá cao, nhưng phương pháp này thực sự gọn gàng. Cảm ơn – CodeWrite

Các vấn đề liên quan