Wszystko, mam metodę, która jest obecnie używana do wywoływania bibliotek DLL typu zwracającego bool
, działa to świetnie. Metoda ta jestDefiniowanie metod ogólnych
public static bool InvokeDLL(string strDllName, string strNameSpace,
string strClassName, string strMethodName,
ref object[] parameters,
ref string strInformation,
bool bWarnings = false)
{
try
{
// Check if user has access to requested .dll.
if (!File.Exists(Path.GetFullPath(strDllName)))
{
strInformation = String.Format("Cannot locate file '{0}'!",
Path.GetFullPath(strDllName));
return false;
}
else
{
// Execute the method from the requested .dll using reflection.
Assembly DLL = Assembly.LoadFrom(Path.GetFullPath(strDllName));
Type classType = DLL.GetType(String.Format("{0}.{1}",
strNameSpace, strClassName));
if (classType != null)
{
object classInstance = Activator.CreateInstance(classType);
MethodInfo methodInfo = classType.GetMethod(strMethodName);
if (methodInfo != null)
{
object result = null;
result = methodInfo.Invoke(classInstance, new object[] { parameters });
return Convert.ToBoolean(result);
}
}
// Invocation failed fatally.
strInformation = String.Format("Could not invoke the requested DLL '{0}'! " +
"Please insure that you have specified the namespace, class name " +
"method and respective parameters correctly!",
Path.GetFullPath(strDllName));
return false;
}
}
catch (Exception eX)
{
strInformation = String.Format("DLL Error: {0}!", eX.Message);
if (bWarnings)
Utils.ErrMsg(eX.Message);
return false;
}
}
Teraz chcę przedłużyć ten sposób, aby można było pobierać wartości zwracanych z DLL z dowolnego typu. Planowałem zrobić to za pomocą leków generycznych, ale natychmiast udałem się na nieznane mi terytorium. Jak zwrócić T, gdy jest nieznany w czasie kompilacji, spojrzałem na refleksję, ale nie jestem pewien, w jaki sposób byłby używany w tym przypadku. Zapoznaj się z pierwszym sprawdzeniem w powyższym kodzie:
public static T InvokeDLL<T>(string strDllName, string strNameSpace,
string strClassName, string strMethodName,
ref object[] parameters, ref string strInformation,
bool bWarnings = false)
{
try
{
// Check if user has access to requested .dll.
if (!File.Exists(Path.GetFullPath(strDllName)))
{
strInformation = String.Format("Cannot locate file '{0}'!",
Path.GetFullPath(strDllName));
return "WHAT/HOW??";
...
Jak mogę osiągnąć to, co chcę, czy powinienem po prostu przeciążać metodę?
Dziękuję bardzo za pomoc.
W drugim bloku kodu, który wygląda jak warunek błędu. Czy nie byłoby lepiej "rzucić nowe ArgumentException()"? Jeśli chodzi o inne zwroty, rób to, co sugeruje Heinzi. –
+1 Nie jestem pewien w tym przypadku. Czasami lepiej jest zdefiniować przyczynę błędu jako wyjątek. Wiadomość może czasami być tajemnicza dla użytkownika. Jednak powiedziawszy, że nie jestem pewien, jest to jeden z tych przypadków. Dziękuję za poświęcony czas ... – MoonKnight
Zgadzam się z Jessem - jeśli nie uda ci się znaleźć lub wywołać metody, powinieneś rzucić. Użytkownik powinien oczekiwać, że powrót oznacza sukces. Zarządzany świat używa wyjątku do komunikowania takich awarii. Nie specjalistyczne zwroty. – payo