Атрибут для генерации ошибки компиляции при вызове метода? - PullRequest
4 голосов
/ 14 февраля 2010

Я хотел бы убедиться, что метод (фактически конструктор в моем случае) никогда не вызывается явно из кода. Он должен вызываться только через отражение во время выполнения. Для этого я хотел бы применить атрибут к методу, который будет вызывать ошибку компилятора, если метод вызывается, что-то вроде:

[NotCallable("This method mustn't be called from code")]
public void MyMethod()
{
}

Я знаю, что мог бы сделать метод закрытым, но в этом случае я бы не смог вызвать его через отражение в контексте частичного доверия ...

Для полноты вот более подробная информация о том, почему мне нужно это сделать:

Я реализую класс Singleton<T> многократного использования, основанный на статье Джона Скита . Вот мой код:

public static class Singleton<T>
{
    public static T Instance
    {
        get
        {
            return LazyInitializer._instance;
        }
    }

    private class LazyInitializer
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static LazyInitializer()
        {
            Debug.WriteLine(string.Format("Initializing singleton instance of type '{0}'", typeof(T).FullName));
        }

        internal static readonly T _instance = (T)Activator.CreateInstance(typeof(T), true);
    }
}

(обратите внимание, как я создаю экземпляр T, используя Activator.CreateInstance)

Затем я могу использовать его с таким классом:

private class Foo
{
    protected Foo()
    {
    }

    public string Bar { get; private set; }
}

И позвоните Singleton<Foo>.Instance, чтобы получить доступ к экземпляру.

При частичном доверии это не сработает, потому что конструктор Foo не является открытым. Но если я сделаю его общедоступным, ничто не помешает вызвать его явно из кода ... Я знаю, что мог бы применить ObsoleteAttribute к конструктору Foo, но он будет генерировать только предупреждение, и многие люди просто игнорируют предупреждения.

Итак, есть ли атрибут, аналогичный ObsoleteAttribute, который будет выдавать ошибку вместо предупреждения?

Любое предложение будет оценено.

1 Ответ

7 голосов
/ 14 февраля 2010

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

[Obsolete("Don't use this", true)]

Однако на вашем месте я бы пересмотрел свой дизайн, поскольку это не является признаком хорошо разработанного API.

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