2009-03-23 44 views
13

Có cách nào tôi có thể lấy tên thuộc tính lớp học IntProperty?Làm thế nào để có được tên của một tài sản lớp học?

public class ClassName 
{ 
    public static int IntProperty { get { return 0; } } 
} 

//something like below but I want to get the string of "IntProperty" 
ClassName.IntProperty.GetType().Name 

Về cơ bản, điều tôi muốn làm là lưu động tên chuỗi thuộc tính vào cơ sở dữ liệu và sau đó truy xuất thuộc tính động.

Có vẻ như những gì tôi đang tìm kiếm cũng tương tự như cách gõ vịt tôi nghĩ.

Cảm ơn!

CẬP NHẬT:

Đây là mã thực tế. Điều này giống như một loại công việc của điều. Nhưng mỗi nhiệm vụ được định nghĩa là thuộc tính của một lớp (lớp được sử dụng để nhóm các nhiệm vụ).

public class ApplicationTask 
{ 
    public static Task<string> SendIncompleteNotification 
    { 
     get 
     { 
      return new Task<string> 
       (
       a => Console.WriteLine("Sample Task") 
       , "This is a sample task which does nothing." 
       ); 
     } 
    } 
} 

Vì vậy, các mã sẽ có thể lấy lại tên đầy đủ của lớp và tài sản gì đó như: namespace.ApplicationTask.SendIncompleteNotification và tiết kiệm này vào cơ sở dữ liệu. Sau đó, mã sẽ đọc chuỗi và tự động tạo nhiệm vụ và chuyển nó vào một lệnh khác để thực thi.

+0

liên quan: http://stackoverflow.com/questions/579963/can-i- get-specific-metadata-from-a-funct-object http://stackoverflow.com/questions/301809/workarounds-for-nameof-operator-in-c-typesafe-databinding – nawfal

+0

có thể trùng lặp của [Nhận tên phương thức và nhập bằng cách sử dụng biểu thức lambda] (http://stackoverflow.com/questions/273941/g et-method-name-and-type-using-lambda-expression) – nawfal

Trả lời

8

Kết quả của ClassName.IntProperty chỉ là một giá trị số nguyên. Ngay sau khi nó được thực hiện và kết quả được trả về, không có dấu vết của nó đến từ IntProperty.

Nếu bạn đang sử dụng .NET 3.5 bạn có thể sử dụng một cây biểu hiện thay vào đó, thường tạo ra thông qua một biểu thức lambda:

Expression<Func<int>> exp =() => ClassName.IntProperty; 

Sau đó bạn có thể biên dịch và thực thi biểu thức riêng tìm hiểu những gì nó có đang thực hiện (truy xuất IntProperty trong trường hợp này). Tôi không thực sự chắc chắn liệu điều này có phù hợp với những gì bạn muốn làm hay không.

Nếu bạn làm hãy tìm cách lưu tên thuộc tính trong cơ sở dữ liệu, sau đó GetProperty là cách để tiếp tục truy xuất.

Có lẽ nếu bạn có thể cung cấp thêm ngữ cảnh trong câu hỏi về cách bạn muốn sử dụng điều này, chúng tôi có thể trợ giúp thêm. Bạn đã chỉ hiển thị một biểu thức - nếu bạn có thể hiển thị nó ở những nơi bạn sẽ sử dụng nó, điều đó thật tuyệt vời.

EDIT: Bạn đã mở rộng thuộc tính, chứ không phải cách nó được gọi. Bạn có cần cần gọi số để gọi trực tiếp, thay vì chỉ tìm nạp danh sách thuộc tính bằng cách sử dụng Type.GetProperties và lưu trữ danh sách tên thuộc tính trong cơ sở dữ liệu không?

Một lần nữa, nếu bạn có thể hiển thị mã mà gọi thuộc tính và cách bạn muốn nó tương tác với cơ sở dữ liệu, chúng tôi có thể tiến bộ hơn.

+0

Xem thêm các cuộc thảo luận ở đây (và các địa điểm khác): http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression/ –

3
Type objectType = this.GetType(); 
PropertyInfo property = objectType.GetProperty("intProperty"); 
System.Console.Write(property.Name); 

Đây có phải là những gì bạn cần không?

+0

xin lỗi nó không phải là những gì tôi muốn. Tôi đã chỉnh sửa bài đăng để làm rõ hơn. – Jeff

+0

Điều gì sẽ xảy ra nếu bạn quyết định thay đổi tên "intProperty"? Bạn sẽ phải nhớ để thay đổi điều này, quá. Imho đó là một thực tế tồi tệ để truyền bá những chuỗi ma thuật đó trong codebase của bạn. Tôi muốn khuyên bạn nên sử dụng một cái gì đó như nameof (ClassName.IntProperty) như wintersolider chỉ ra. – Alan

20

Tôi nghĩ rằng việc sử dụng phương pháp GetProperty trong trường hợp này là không cần thiết vì bạn cần biết tên thuộc tính để gọi phương thức.

Bạn có thể lặp qua các thuộc tính của bạn và trích xuất tên gọi của nó:

foreach (PropertyInfo p in typeof(ClassName).GetProperties()) 
{ 
    string propertyName = p.Name; 
    //.... 
} 
-3

Tôi đã xem xét điều này và có vẻ như rất hữu ích khi nhận được tên thuộc tính. (C++)

#define getVarName(varName,holder) sprintf(holder, "%s", #varName) 

int main() { 
    int var = 100; // just any type of identifier 
    char name[100]; // it will get the variables name 
    getVarName(var, name); 
    puts(name); 
    return 0; 
} 

ref: http://zobayer.blogspot.com/2010/05/c-fun-get-variables-name.html

+0

Câu hỏi được đề cập một cách rõ ràng C#. Tôi đề nghị bạn đăng một chuyển đổi mã như C + + có thể không có khả năng chuyển đổi sang C# một cách dễ dàng. – jamesdeath123

20

Với C# 6.0 bạn có thể nhận được nó bằng cách

nameof(ClassName.IntProperty) 
+0

Đây là những gì tôi đang tìm kiếm. Dường như cách duy nhất để chọn liên kết với một thuộc tính cụ thể trên một lớp thực hiện INotifyPropertyChanged – Assimilater

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