Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性在C中创建字段#_C#_Attributes - Fatal编程技术网

C# 属性在C中创建字段#

C# 属性在C中创建字段#,c#,attributes,C#,Attributes,好吧,在我玩了几个小时没有用之后,我建立了一个模型: [AttributeUsage(AttributeTargets.All)] public class PublicAttribute : System.Attribute { public enum Access { Public, Private } public PublicAttribute(string Name, Access acs) { } public PublicAttribute(

好吧,在我玩了几个小时没有用之后,我建立了一个模型:

[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";

如果有人试图进入私有财产,他们可以:

ContainingClass.PublicProperty=//ect

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

我想知道的是:

  • 这可能吗
  • 有什么东西已经做到了吗
  • 如果可能的话,(即使有其他事情),我该怎么做
  • 微软在某种程度上让人联想到你试图描述的内容,使它比C#
    public
    更能代表权限,从而有效地使整个互联网(一个非常全球化的范围)都能从应用程序域之外获得一种方法。您可以阅读它以获得真正的实现洞察力和想法


    但你打得很简单。您必须对一些基础设施进行编程以使其正常工作。它不是自动生成的,并且您无法访问Microsoft的源代码以获取所有详细信息。

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


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

    基本上对所有3个都没有,因为C#是一种强类型语言。即使用duck输入你想要达到的目标也不符合语言


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

    我认为
    ContainingClass.PublicProperty=/ect
    仍然不会编译,即使使用AOP后编译器,Having说,+1作为postsharp可能是他想要的,这取决于postsharp是否能够发出额外的属性,而不仅仅是重写现有的方法。我对PostSharp不太熟悉,不知道这是否是它的一部分,但是没有技术上的原因让post编译器不能做到这一点。再想想,你是对的。当从引用后处理程序集的另一个项目访问时,它将工作,但在他声明ContainingClass的项目中不工作。WebMethodAttribute有点不同。它指示Web服务路由基础结构为该方法呈现SOAP操作。它实际上并不在类上创建额外的编译时成员(在sniperX的例子中,是一个属性)。
    [Public("PublicProperty", PublicAttribute.Access.Public, ()=>{return PrivateProperty;}, ()=>{PrivateProperty = value})]
    private string PrivateProperty = "hello";