2010-03-06 64 views
3

好了,所以我玩了几个小时左右无果后,我建立了一个模型:属性在C#创建领域

[AttributeUsage(AttributeTargets.All)] 
public class PublicAttribute : System.Attribute 
{ 
    public enum Access { Public, Private } 
    public PublicAttribute(string Name, Access acs) 
    { 
    } 
    public PublicAttribute(string Name, Access acs, Action get, Action set) 
    { 
    } 
} 

所以,如果有人是做这样的事情:

[Public("PublicProperty", PublicAttribute.Access.Public)] 
private string PrivateProperty = "hello"; 

[Public("PublicProperty", PublicAttribute.Access.Public,()=>{return PrivateProperty;},()=>{PrivateProperty = value})] 
private string PrivateProperty = "hello"; 

,然后,如果有人试图访问PrivateProperty,他们可能只是去:

ContainingClass.PublicProperty = // ect

“PublicProperty”。这是因为属性,它会使用这些get/set访问器。

我想知道些什么:

  1. 这甚至可能吗?
  2. 有没有东西已经做到了这一点?
  3. 如果可能的话(即使有别的东西)我该怎么做?

回答

4

基本上没有3,因为C#是强类型语言。即使用鸭子打字,你想要达到的效果也不符合语言。

您编写的属性允许您查询在类中具有这些属性的属性,但仍需要使用Reflection来发现设置属性类的哪些属性。您想要使用的语法在编译时处检查

0

微软的方式让人想起你试图描述使得它代表比C#public更多的权限是什么让WebMethodAttribute,有效地使整个Internet中可用的应用程序域之外的方法(很全局范围) 。您可能会阅读它以获得真正的实施见解和想法。

但是你打的很简单。你将不得不编程一些基础设施来使其工作。这不是自动的,你无法访问所有细节的微软源代码。

+0

WebMethodAttribute有点不同。它指示Web服务路由基础设施为该方法展示SOAP操作。它实际上并没有在类上创建额外的编译时成员(在sniperX的情况下是一个属性)。 – itowlson 2010-03-06 02:21:18

1

不,这是不可能的使用属性。属性是C#编译器发出的类元数据的一部分,C#编译器不考虑自定义属性。

您可能可以通过使用PostSharp等后处理程序来完成此操作,PostSharp可以在事后重写您的程序集,并且可以指示考虑自定义属性。但是,您仍然无法在属性中包含委托:可以存储在属性状态中的一组类型非常有限。

+0

我觉得'ContainingClass。PublicProperty = // ect'仍然无法编译,即使使用AOP后编译器 – 2010-03-06 02:20:54

+0

说了这么一句,+1作为postsharp可能是他之后的 – 2010-03-06 02:23:23

+0

取决于PostSharp是否能够发出其他属性,而不仅仅是重写现有的方法。我不太了解PostSharp是否知道它是否是它的一部分,但是没有任何技术上的原因,后期编译器无法做到这一点。 – itowlson 2010-03-06 02:23:23