Атрибуты создания полей в C # - PullRequest
3 голосов
/ 06 марта 2010

Хорошо, так что после нескольких часов игры безрезультатно, я построил модель:

[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, он может просто пойти:

ContainedClass.PublicProperty = // ect

"общественная собственность". и это из-за атрибута, и он будет использовать эти методы доступа get / set.

Что бы я хотел знать:

  1. Возможно ли это вообще?
  2. Есть ли что-то, что уже делает это?
  3. Если это возможно, (даже если есть что-то еще) Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 06 марта 2010

В основном нет для всех 3, так как C # является строго типизированным языком. То, чего вы пытаетесь добиться, даже при вводе утки не соответствует языку.

Атрибуты, которые вы написали, позволяют запрашивать свойства, которые имеют эти атрибуты в классе, но вам все равно нужно использовать Reflection, чтобы узнать, какие свойства класса атрибута установлены. Синтаксис, который вы хотите использовать, проверяется во время компиляции .

1 голос
/ 06 марта 2010

Нет, это невозможно при использовании атрибутов.Свойства являются частью метаданных класса, передаваемых компилятором C #, и компилятор C # не учитывает пользовательские атрибуты.

Вы можете сделать это с помощью постпроцессора, такого как PostSharp, который может переписать вашсборка после факта, и может быть проинструктирован для рассмотрения пользовательских атрибутов.Однако вы все равно не сможете включить делегата в атрибут: набор типов, которые могут храниться в состоянии атрибута, крайне ограничен.

0 голосов
/ 06 марта 2010

Microsoft сделала WebMethodAttribute способом, напоминающим то, что вы пытаетесь описать, делая его представляющим больше разрешений, чем C # public, эффективно делая метод доступным вне домена приложения для всего Интернета ( очень глобальная сфера). Вы могли бы прочитать это, чтобы получить реальное понимание реализации и идеи.

Но ты попадаешь очень просто. Вам придется запрограммировать некоторую инфраструктуру, чтобы она работала. Это не автоматически, и у вас нет доступа к исходному коду Microsoft для всех деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...