Todo, tengo un método que se utiliza actualmente para invocar DLL de tipo de retorno bool
, esto funciona muy bien. Este método esDefinición de métodos genéricos
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;
}
}
Ahora, quiero extender este método para que pueda recuperar los valores de retorno desde un archivo DLL de cualquier tipo . Planeé hacer esto usando genéricos, pero de inmediato ingresé en territorio desconocido para mí. ¿Cómo devuelvo T cuando se desconoce en el momento de la compilación? He examinado la reflexión, pero no estoy seguro de cómo se usaría en este caso. Tome el primer cheque en el código anterior
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??";
...
¿Cómo puedo lograr lo que quiero, o tendría que acaba de sobrecargar el método?
Muchas gracias por su ayuda.
En su segundo bloque de código, se ve como una condición de error. ¿No sería más apropiado 'lanzar una nueva ArgumentException()'? En cuanto a las otras devoluciones, haz lo que sugiere Heinzi. –
+1 No estoy seguro en este caso. A veces es más claro definir usted mismo la causa del error como Exception.Message a veces puede ser críptico para el usuario. Sin embargo, una vez dicho esto, no estoy seguro de que este sea uno de esos casos. Gracias por su tiempo ... – MoonKnight
Estoy de acuerdo con Jesse: si no logra encontrar ni invocar el método, debe tirar. El usuario debe esperar que un retorno implique el éxito. El mundo administrado usa la excepción para comunicar fallas como esta. No retornos especializados. – payo