2013-05-01 42 views
5

Tôi muốn chỉ định chuỗi thuộc tính cho thuộc tính bên dưới.Làm cách nào tôi có thể gán một thuộc tính cho một thuộc tính

[ExtractKeyAttribute(**"Extraction"**)] 

public class Extract 
{ 
    .... 
} 

vì vậy trích xuất là chuỗi của tôi nhưng tôi không muốn mã cứng vào đó. Mọi đề xuất về cách tốt hơn để chỉ định

+0

Bạn có thể đặt thuộc tính vào chính thuộc tính không? –

+0

Làm thế nào để gọi những gì? Có vẻ như bạn có một thuộc tính xác định những gì nên được trích xuất dưới dạng khóa, phải không? Vì vậy, có thể nếu bạn có thuộc tính 'KeyName' và đặt nó vào thuộc tính, thì mọi thứ đang thực hiện phép khai thác có thể tìm thuộc tính' KeyName' của bạn trên thuộc tính của lớp, sau đó lấy tên của khóa từ bất kỳ thuộc tính nào có thuộc tính đó. Điều đó có ý nghĩa? –

+0

@ChrisNielsen Có nghĩa là giao phối hợp lý ... Tôi đã đưa vào chuỗi const và gán cho thuộc tính. – user1990395

Trả lời

13

Bạn không thể thực hiện việc này.

Giá trị thuộc tính phải là các biểu thức liên tục. Các giá trị được đưa vào mã được biên dịch. Nếu bạn không muốn sử dụng một biểu thức liên tục, bạn không thể sử dụng một thuộc tính ... và bạn có thể không nên. Nó có thể có nghĩa là bạn đang sử dụng các thuộc tính khi bạn nên sử dụng một cách tiếp cận khác.

Bạn có thể muốn đọc bài đăng trên blog của Eric Lippert trên properties vs attributes.

Tất nhiên, bạn không phải sử dụng chuỗi ký tự ở đó. Bạn có thể có:

[ExtractKey(ExtractionKeys.Extraction)] 
... 


public static class ExtractionKeys 
{ 
    public const string Extraction = "Extraction"; 
} 

... nhưng nó vẫn là hằng số biên dịch.

+0

Cảm ơn bạn đã trả lời nhanh chóng và hãy để tôi kiểm tra qua liên kết – user1990395

+0

@ user1990395: Tôi e rằng tôi không biết ý của bạn là gì. Vui lòng làm rõ nhận xét của bạn và tôi có thể trả lời. –

+0

Chỉ để hoàn thành, một tùy chọn (-ish) phổ biến khác để tránh các ký tự cứng là phân lớp thuộc tính sao cho lớp con có thể giải quyết giá trị thực tại thời gian chạy trong mã thông thường. –

0

Trong nhận xét của bạn, bạn nói rằng bạn có tất cả (chuỗi) giá trị trong một lớp tĩnh. Lớp tĩnh của bạn là một lớp với các thuộc tính chỉ đọc? Ý tôi là, các giá trị có thay đổi không? Nếu không, hãy thay thế một số thuộc tính trong lớp tĩnh của bạn bằng các giá trị chuỗi ký tự const. U có thể sử dụng các giá trị này để đặt thuộc tính của bạn.

Vậy ...

static class MyClass 
{ 
    public string MyValue {get;} 
} 

sẽ trở thành:

static class MyClass 
{ 
    public const string MyValue= "MyValue"; 
} 

Bây giờ thuộc tính của bạn có thể được thiết lập như sau:

[ExtractKey(MyClass.MyValue)] 
0

Nếu bạn muốn thay đổi tài sản của bạn trong thời gian chạy, khi đó bạn có thể thực hiện điều này bằng mã này:

ExtractKeyAttribute myAttribute = typeof(Extract).GetCustomAttributes(typeof(ExtractKeyAttribute), false)[0] as ExtractKeyAttribute; 
myAttribute.MyValue = "MyRunTimeValue"; 
Các vấn đề liên quan