Как вызвать статический конструктор

code:

class Base<T,U> where T:Base<T,U>,new()  where U :class
{
    protected static U _val = null;
    internal static void ShowValue()
    {
        if(_val == null)new T(); //Without this line, it won't work as expected
        Console.WriteLine (_val);
    }
    internal static void Virtual()
    {
        Console.WriteLine ("Base");
    }
}
class Deriv :Base<Deriv,string>
{
    static Deriv()
    {
        _val = "some string value";
    }
    internal static new void Virtual ()
    {
        Console.WriteLine ("Deriv");
    }
}
 public static void Main (string[] args)
{
    Deriv.ShowValue();            
    Deriv.Virtual();
}

Благодаря универсальным компонентам .NET я могу создать группу определенных классов, повторно используя общие статические методы, определенные в универсальном базовом классе. Он может до некоторой степени имитировать полиморфизм наследования. Но чтобы инициализировать другую версию статических полей, я использую статические конструкторы. К сожалению, мы не можем вызвать их напрямую, поэтому мы должны найти способ вызвать его вызов. Приведенный выше пример показывает путь. Но мне не нравится ни создание экземпляра, ни подход отражения. Мы также не можем наложить ограничение на статический метод универсального параметра. Итак, я хотел бы спросить, есть ли другой способ сделать такую ​​работу!

Заранее спасибо!

~~~~~~~~~~~~~~~~

Некоторое заключение (Возможно, немного раньше):

Кажется, нет обходного пути справиться с подобной ситуацией. Мне нужно создать подкласс или использовать отражение. Учитывая, что .cctors нужно просто вызывать один раз, я поддерживаю подход отражения, потому что в некоторых случаях ограничение new () просто не является выбором - например, вы не должны предоставлять пользователю ctor без параметров.

После проведения дальнейшего эксперимента я обнаружил, что .cctors можно вызывать многократно, но только первый вызов повлияет на установку статических полей. Это странно, но приятно!

    class MyClass 
    {
        static int _val = 0;
        static MyClass()
        {
            _val++;
            Console.WriteLine (_val);
        }
    }
    public static void Main (string[] args)
    {
        ConstructorInfo ci = typeof(MyClass).TypeInitializer;
        ci.Invoke(new object[0]);
        ci.Invoke(new object[0]);
        ci.Invoke(new object[0]);
    }
//result:
//1
//1
//1
//1
6
задан Need4Steed 2 August 2011 в 08:56
поделиться