在C#中创建字段的属性

时间:2010-03-06 02:15:04

标签: c# attributes

好吧,所以在我玩了几个小时之后无所事事,我建立了一个模型:

[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

“公物”。这是因为属性,它将使用那些get / set访问器。

我想知道的事情:

  1. 这可能吗?
  2. 有什么东西可以做到吗?
  3. 如果可能,(即使还有别的东西)我该怎么做?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

微软以WebMethodAttribute的方式让人联想到你想要描述的内容,使其代表比C#public更多的权限,从而有效地使应用程序域外的方法可用于整个互联网(一个非常全球化的范围)。您可能会阅读它以获得真正的实施见解和想法。

但是你很简单。您必须对一些基础设施进行编程才能使其正常运行。它不是自动的,您无法访问Microsoft的所有详细信息源代码。