如何将属性分配给属性?(关于IT技术的问题)

5

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

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

public class Extract
{
  ....
}

所以提取是我的字符串,但我不想硬编码到那里。有没有更好的方法来分配?


你能把属性放在属性本身上吗? - Chris Nielsen
如何调用什么?看起来你有一个定义应该被提取为键的属性,对吧?所以,如果你有一个 KeyName 属性并将其放置在属性上,那么无论是谁在进行提取,都可以查找类的属性中的 KeyName 属性,然后从具有该属性的任何属性中获取键的名称。这样说通了吗? - Chris Nielsen
@ChrisNielsen 是的,伙计,那很有道理...我已经使用 const string 并将其分配给属性了。 - user1990395
3个回答

13

你不能这样做。

属性值必须是常量表达式,这些值被嵌入到编译代码中。如果你不想使用常量表达式,就不能使用属性...你可能也不应该使用它。这可能意味着当你应该使用其他方法时,你正在使用属性。

你可能想阅读Eric Lippert关于属性和特性的博客文章

当然,你不一定要在那里使用字符串字面值。你可以有:

[ExtractKey(ExtractionKeys.Extraction)]
...


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

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


@user1990395:恐怕我不明白你的意思。请澄清你的评论,也许我能回答你。 - Jon Skeet
为了完整起见,避免硬编码的另一个常见选项是子类化属性,使得子类可以在常规代码中在运行时解析实际值。 - Marc Gravell
1
@JonSkeet 你好Jon,我的意图是将这些属性字符串在未来更改,以便我可以在单独的类文件或配置文件中维护这些字符串值。我需要根据Attribute中的这些字符串运行类。将来,我只需要更改字符串值,而不是更改类文件。 - user1990395
请注意,如果它们位于不同的程序集中,则字符串值将被复制到声明属性的二进制文件中。在这里要非常小心。 - Jon Skeet
@JonSkeet 确实如此 Jon。是的,它们在不同的程序集中。我真的很担心这个问题。 - user1990395
显示剩余4条评论

0
在您的评论中,您说您在一个静态类中拥有所有(字符串)值。您的静态类是具有只读属性的类吗?我的意思是,这些值是否会改变?如果没有,请将静态类中的某些属性替换为const字符串值。您可以使用这些值来设置属性。
所以...
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";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接