2013-05-01 171 views
5

我想将属性字符串分配给以下属性。如何将属性分配给属性

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

public class Extract 
{ 
    .... 
} 

所以提取是我的字符串,但我不想硬代码到那里。任何建议更好的方式分配

+0

你可以把属性本身吗? – 2013-05-01 14:19:19

+0

如何调用什么?它看起来像你有一个属性,它定义了什么应该被提取为一个关键,对吗?所以,如果你有'KeyName'属性并将它放在属性上,那么无论提取什么东西都可以在类的属性上查找你的'KeyName'属性,然后从哪个属性获取该属性的关键字名称。那有意义吗? – 2013-05-01 14:26:43

+0

@ChrisNielsen是的,这是合理的队友...我已经给const字符串和分配给属性。 – user1990395 2013-05-01 14:37:54

回答

13

你不能这样做。

属性值必须是常量表达式。这些值被烘焙到编译后的代码中。如果你不想使用一个常量表达式,你不能使用一个属性......而你可能不应该使用这个属性。这可能意味着当你应该使用不同的方法时你正在使用属性。

您可能想要阅读Eric Lippert的properties vs attributes的博客文章。

当然,你不必在那里使用字符串。你可以有:

[ExtractKey(ExtractionKeys.Extraction)] 
... 


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

...但它仍然是一个编译时常量。

+0

感谢您的及时回复,并让我检查通过链接 – user1990395 2013-05-01 14:21:46

+0

@ user1990395:恐怕我不知道你的意思。请澄清您的评论,我可以回答。 – 2013-05-01 14:25:01

+0

为了完整起见,避免使用硬文本的另一个常用(-ish)选项是对属性进行子类化,以便子类可以在运行时以常规代码解析实际值。 – 2013-05-01 14:25:03

0

在你的评论中,你说你有一个静态类中的所有(字符串)值。你的静态类是只读属性吗?我的意思是,值是否改变?如果不是,用静态字符串值替换静态类中的一些属性。 U可以使用这些值来设置您的属性。

所以......

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

将成为:

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

现在你的属性可以设置如下:

[ExtractKey(MyClass.MyValue)] 
0

如果要修改的属性您属性在运行时,那么你可以用这个代码做到这一点:

ExtractKeyAttribute myAttribute = typeof(Extract).GetCustomAttributes(typeof(ExtractKeyAttribute), false)[0] as ExtractKeyAttribute; 
myAttribute.MyValue = "MyRunTimeValue"; 
相关问题