Я определил следующее свойство, поскольку мы часто используем это в поблочном тестировании.
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
изменения это к нормальному формату окон.
Сделайте retval = Ctype (Mystring, T) или retVal = Ctype (MyInt, T)
При использовании универсального метода 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 ограничено для использования со ссылочными типами, но это уже другая история)
Обычно при создании общих методов вы захотите сделать то же самое с любым ввод, который вы получите, но безопасным способом.
Альтернативным решением является инкапсуляция такой логики в классе и использование функции 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