Я хотел бы убедиться, что метод (фактически конструктор в моем случае) никогда не вызывается явно из кода. Он должен вызываться только через отражение во время выполнения. Для этого я хотел бы применить атрибут к методу, который будет вызывать ошибку компилятора, если метод вызывается, что-то вроде:
[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
, который будет выдавать ошибку вместо предупреждения?
Любое предложение будет оценено.