Как передать универсальный тип без интерфейса для функции Of T - PullRequest
0 голосов
/ 08 июня 2009

У меня есть следующий код, который отлично работает

MsgBox(AddSomething(Of String)("Hello", "World"))

Public Function AddSomething(Of T)(ByVal FirstValue As T, ByVal SecondValue As T) As String
    Return FirstValue.ToString + SecondValue.ToString
End Function

Теперь мы обновляем дизайн приложения для работы с параметрами различных типов, которые будут предоставлены через XML

  <SomeValues>
    <Add Param1="Somedata" Param2="SomeData" MyType="String"/>
    <Add Param1="Somedata" Param2="SomeData" MyType="MyBusinessObject"/>
  </SomeValues>

Если я пытаюсь указать следующее, выдает ошибку, поскольку принимает только тип

    ''''Get DetailsFromXml --- MyType,Param1,Param2
    MsgBox(AddSomething(Of Type.GetType(MyType))(Param1,Param2))

Как решить эту проблему.

Редактировать

Приведенный выше пример приведен для упрощения вопроса. Актуальная проблема заключается в следующем Я использую SCSF P & P. Ниже приведен код для каждого вида, который должен быть написан для каждого вида

Private Sub tsStudentTableMenuClick()
    Dim _StudentTableListView As StudentListView
    _StudentTableListView = ShowViewInWorkspace(Of StudentListView)("StudentTable List", WorkspaceNames.RightWorkspace)
    _StudentTableListView.Show()
End Sub

Теперь я хочу показать виды динамически.

 Public Sub ShowModalView(ByVal ViewName As String)
        Dim _MasterListView As >>>EmployeeListView<<<<
        _MasterListView = ShowViewInWorkspace(Of >>>EmployeeListView<<<)("Employee List", WorkspaceNames.RightWorkspace)
        _MasterListView.Show()
    End Sub

Таким образом, часть, показанная с помощью стрелок выше, должна как-то динамически предоставляться.

Ответы [ 3 ]

3 голосов
/ 08 июня 2009

Суть обобщений заключается в предоставлении дополнительной информации на время компиляции . Вы получите эту информацию только в время выполнения .

Поскольку вы используете VB, вы можете иметь возможность отключить Option Strict для достижения позднего связывания. Я не знаю, можете ли вы отключить его для небольшого фрагмента кода - это было бы идеально, на самом деле.

В противном случае, и если вы действительно не можете получить информацию во время компиляции, вам нужно вызвать ее с отражением - получить общий «план» метода, вызвать MethodInfo.MakeGenericMethod а затем вызвать его.

Я предполагаю, что реальный метод несколько сложнее? В конце концов, вы можете позвонить ToString() на что угодно ...

(Вполне возможно, что в .NET 4.0 у вас будет больше возможностей. Вы наверняка могли бы использовать dynamic в C # 4.0, и я считаю, что VB10 будет обеспечивать такую ​​же функциональность.)

2 голосов
/ 08 июня 2009

Если все, что вы делаете, это ToString, то создание параметров object вместо этого решит проблему самым простым способом. В противном случае вам придется связывать тип во время выполнения, который в C # выглядит следующим образом:

System.Reflection.MethodInfo mi = GetType().GetMethod("AddSomething");
mi = mi.MakeGenericMethod(Type.GetType(MyType));
object result = mi.Invoke(this, new object[] { Param1, Param2 });

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

2 голосов
/ 08 июня 2009

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

В этом случае вы всегда просто вызываете метод .ToString(). Если это действительно все, что делает ваш код, вы можете просто изменить тип параметра на Object вместо использования универсального метода. Если это немного сложнее, вы можете также попытаться потребовать от ваших параметров реализации какого-то общего интерфейса, который вы определите.

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