Обобщения в c # и доступ к статическим членам T - PullRequest
13 голосов
/ 21 августа 2008

Мой вопрос касается c # и как получить доступ к Static memebers ... Ну, я действительно не знаю, как это объяснить (что плохо для вопроса, не так ли?) Я просто дам вам пример кода :

Class test<T>{
     int method1(Obj Parameter1){
         //in here I want to do something which I would explain as
         T.TryParse(Parameter1);

         //my problem is that it does not work ... I get an error.
         //just to explain: if I declare test<int> (with type Integer)
         //I want my sample code to call int.TryParse(). If it were String
         //it should have been String.TryParse()
     }
}

Так что, спасибо вам, ребята, за ваши ответы (кстати, вопрос: как бы я решил эту проблему, не получив ошибку). Это, наверное, довольно простой вопрос для вас!

Спасибо, Никлас


Редактировать: Спасибо всем за ответы!

Хотя я думаю, что фраза «поймай и поймай» - самая элегантная, я знаю по своему опыту с vb, что она действительно может быть обломом. Я использовал его один раз, и для запуска программы потребовалось около 30 минут, а позже вычисление заняло всего 2 минуты только потому, что я избегал try - catch.

Вот почему я выбрал swich в качестве лучшего ответа. Это делает код более сложным, но, с другой стороны, я представляю его относительно быстрым и относительно легким для чтения. (Хотя я все еще думаю, что должен быть более элегантный способ ... может быть, на следующем языке, который я изучаю: P)


Хотя, если у вас есть другое предложение, я все еще жду (и желаю участвовать)

Ответы [ 12 ]

0 голосов
/ 21 августа 2008

Это не то, как работает статика. Вы должны думать о статиках как о классе Global, даже если они распределены по целому ряду типов. Я рекомендую сделать это свойство внутри экземпляра T, которое может обращаться к необходимому статическому методу.

Также T является фактическим экземпляром чего-либо, и, как и любой другой экземпляр, вы не можете получить доступ к статике для этого типа через экземплярное значение. Вот пример того, что нужно сделать:

class a {
    static StaticMethod1 ()
    virtual Method1 ()
}

class b : a {
    override Method1 () return StaticMethod1()
}

class c : a {
    override Method1 () return "XYZ"
}

class generic<T> 
    where T : a {
    void DoSomething () T.Method1()
}
0 голосов
/ 21 августа 2008

Вы, вероятно, не можете это сделать.

Прежде всего, если бы это было возможно, вам понадобится более жесткая граница для T, чтобы проверщик типов мог быть уверен, что все возможные замены для T действительно имеют статический метод TryParse.

...