2013-10-22 41 views
0

正常情况下,当您创建自定义Attribute类时,任何具有getter和setter的公共属性都会自动公开给在该类上应用该属性的人员,以便使用该属性的人员可以指定该属性的值。你可以在c#中用“隐藏”属性创建一个自定义属性吗?

我想一个自定义属性类暴露了一个特定属性的getter和setter,但让这个属性被指定为命名参数为创建时的属性。例如:

[AttributeUsage(AttributeTargets.Class)] 
class MyCustomAttribute : Attribute 
{ 
    public bool MyProperty 
    { 
     get { /* do something */ } 
     set { /* do something */ } 
    } 
} 


// The following line should be a compiler error, MyProperty should 
// be hidden for attribute initialization! 
[MyCustomAttribute(MyProperty=true)] 
class MyClass 
{ 
}; 

有什么办法可以达到这个目的吗?

+0

没办法。如果它是公开的,你可以设置它。 – JustAndrei

+0

为什么不让“内部”属性? –

+0

无论如何,你为什么要这么做?告诉我们你的用例,也许我们可以提出另一种解决方案。 –

回答

2

如果您打算在您的代码的其他地方使用它,但不希望其他人看到它,您可以简单地创建该属性(或只是属性设置器)internal

另外,如果要公开财产的其他用户,而只是不允许在声明语法设置它,你可以不公开属性setter,而是提供不同的方法来设置值,如果你需要:

class MyCustomAttribute : Attribute 
{ 
    public bool MyProperty 
    { 
     get { /* do something */ } 
    } 

    public void SetMyProperty(bool value) 
    { 
     /* do something */ 
    } 
} 
+0

也可能使用“内部集合”在财产声明中。 – Minustar

+0

@Minustar好点。谢谢。 –

+0

谢谢,我做了类似的事情。将一个公共财产与一个吸气人和二传手一起暴露出来,但是只让二传手内在。我认为这足以满足我的需求。 –

1

如果该属性是公共的,则在应用该属性时无法防止该属性被分配。正如评论中的dtb所建议的,您可以使用getter和setter方法,但这可能不会帮助您...

属性不会在运行时进行修改。当您使用反射从类或成员(或其他任何地方)中检索属性时,只会获得这些属性的副本,因此即使您修改了这些属性,下次您将检索它们时,也会得到一个新的,未修改的副本。

+0

这是真的,但我的应用程序是性能密集型的,我需要在紧密循环中使用这些属性,分析表明使用反射来获取自定义属性是一个巨大的瓶颈。 因此,我采取了缓存属性结构的初始副本,只引用缓存副本,所以复制不会是一个问题。 –

+1

@ZacharyTurner,好的,但在这种情况下,为什么不使用其他类型(而不是属性)来缓存数据呢?这将是更清洁IMO ... –

+0

我想这不是一个坏主意,我可能会考虑这一点。 –

相关问题