2013-01-09 71 views
1

假设我有能够被设置为一个System.Object属性说:c#:将非常量值设置为属性的解决方法?

[AttributeUsage(AttributeTargets.Property)] 
class MyAttrAttribute : Attribute { 
    public object ThisOne { get; set; } 
} 

我想获得的这个相同的结果(不编译):

class AttrTarget { 
    [(MyAttr ThisOne = new MyClass())] 
    public MyClass Thing { get; set; } 
} 

有一种方法可以在不使用反射的情况下实现相同的结果吗?

问候,贾科莫

+1

你不能用属性来做到这一点。在编译时必须知道属性值。 –

+0

@ sa_ddam213 ...或必须从编译时已知的常量值*可检索*;例如,某些内置属性支持翻译之类的继承 - 但“关键”是不变的,即使观察到的值在运行时可能会有所不同。 –

+1

你想做什么?有可能有更好的方法来实现它? – SWeko

回答

1

DefaultValue属性例如有一个Type, String constructor。这可以用来创建一个实例,例如对于期望的时间跨度或期望的颜色:

[DefaultValue(typeof(TimeSpan), "00:00:03")] 
public TimeSpan Timeout {get; set;} 

[DefaultValue(typeof(Color), "Red")] 
public Color HighlightColor {get; set;} 

所以也许这种创建属性值可以帮助您了解如何解决您的问题。

+0

+1 @Oliver,感谢你的这种想法;这里我如何解决类似的问题(http://goo.gl/dssQK),其实问题是关于我最近编写的扩展。我会考虑将这种模式扩展到新功能。 – gsscoder

2

属性根本不适合那种情况。使用反射通常不会真正解决问题,因为不能保证所分配的值将在检查属性的调用之间保留。

+0

+1,ok - >我也得出这个结论......我必须同意 – gsscoder

2

是的,这是如何创建属性 - 他们使用编译时间常量作为参数。但是没有限制为代码,在这种属性的构造函数执行这样的解决方法是继承表格属性:

[AttributeUsage(AttributeTargets.Property)] 
class MyClassMyAttrAttribute:MyAttrAttribute 
{ 
    MyClassMyAttrAttribute() 
    { 
     ThisOne = new MyClass(); 
    } 
} 

,并使用一个:

[MyClassMyAttr] 
public MyClass Thing { get; set; } 

的话在polimorfizm的善良你要求MyAttrAttribute你会得到MyClassMyAttrAttribute的实例。

+0

然而,问题在于'ThisOne'的持续时间是不可预测的;您不保证每次查找它时都会返回相同的'MyClassMyAttrAttribute'实例,因此您唯一可以依赖的是实例的默认值 - 通常不会很有趣。 –

+1

属性中这种东西的唯一用法仅用于信息目的。我不会允许'MyClass'在程序执行期间保持任何可修改的状态。我使用它来设置我的静态只读字段,它们实际上是常量,但不是编译时间常量。 – Rafal

+0

+1 @Rafal感谢您的回复;这对我来说很清楚。事实上,我确实提供了这种初始化方式。也许我正在寻求一种不可能的真正的替代方案来替代C#设计无法实现的东西。 – gsscoder

相关问题