Родовая функция VB.NET

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

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Assembly.Location свойство иногда дает Вам некоторые забавные результаты при использовании NUnit (где блоки, выполненные от временной папки), таким образом, я предпочитаю использовать CodeBase, который дает Вам, путь в формате URI, тогда UriBuild.UnescapeDataString удаляет File:// вначале, и GetDirectoryName изменения это к нормальному формату окон.

8
задан 29 July 2009 в 19:37
поделиться

4 ответа

Сделайте retval = Ctype (Mystring, T) или retVal = Ctype (MyInt, T)

0
ответ дан 5 December 2019 в 10:43
поделиться
retVal = (T) "Hello World!"
1
ответ дан 5 December 2019 в 10:43
поделиться

При использовании универсального метода T каждый раз будет иметь ровно один тип. Допустим, у вас есть код, вызывающий Пример (целого числа) . Теперь в уме замените T на Integer . Результирующий метод будет содержать эти строки (среди прочего).

Dim retval As Integer
    If TypeOf retval Is String Then
        Dim myString As String = "Hello"
        retval = myString
' more code follows '

Присвоение String целому числу, подобному этому, никогда не сработает. Конечно, этот код также никогда не будет выполняться, поскольку блок If предотвращает это, но код все равно не будет компилироваться. (В качестве стороны, приведенный выше код не будет скомпилирован, потому что ключевое слово TypeOf ограничено для использования со ссылочными типами, но это уже другая история)

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

6
ответ дан 5 December 2019 в 10:43
поделиться

Альтернативным решением является инкапсуляция такой логики в классе и использование функции VB CallByName:


    Class Aux(Of T)
        Public Value As T

        Private dicc As Dictionary(Of String, Object)

        Sub New()
            dicc = New Dictionary(Of String, Object)
            dicc.Add("system.string", "hola")
            dicc.Add("system.int32", 15)
            dicc.Add("system.double", 15.0)
        End Sub

        Public Function Test() As T
            Dim typeName As String = GetType(T).ToString.ToLower

            If dicc.ContainsKey(typeName) Then
                CallByName(Me, "Value", CallType.Set, dicc(typeName))
            End If

            Return Value
        End Function

        Protected Overrides Sub Finalize()
            MyBase.Finalize()

            If Not (dicc Is Nothing) Then dicc.Clear()
            dicc = Nothing
        End Sub
    End Class
0
ответ дан 5 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: