5

我想为下面的属性分配一个属性字符串。

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

public class Extract
{
  ....
}

所以提取是我的字符串,但我不希望将硬代码放入其中。有关更好分配方式的任何建议

4

3 回答 3

13

你不能这样做。

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

您可能想阅读 Eric Lippert 关于properties 与 attributes的博客文章。

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

[ExtractKey(ExtractionKeys.Extraction)]
...


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

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

于 2013-05-01T14:19:57.983 回答
0

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

所以...

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

会成为:

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

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

[ExtractKey(MyClass.MyValue)]
于 2013-05-01T14:29:02.280 回答
0

如果您想在运行时修改属性的属性,则可以使用以下代码执行此操作:

ExtractKeyAttribute myAttribute = typeof(Extract).GetCustomAttributes(typeof(ExtractKeyAttribute), false)[0] as ExtractKeyAttribute;
myAttribute.MyValue = "MyRunTimeValue";
于 2013-05-01T14:31:37.510 回答