У меня есть метод, который в настоящее время используется для вызова DLL-типа возвращаемого типа bool
, это отлично работает. Этот методОпределение общих методов
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;
}
}
Теперь я хочу, чтобы распространить этот метод, чтобы я мог получить возвращаемые значения из DLL из любого типа. Я планировал сделать это с помощью дженериков, но сразу ушел на неизвестную мне территорию. Как вернуть T, когда он неизвестен во время компиляции, я посмотрел на размышления, но я не уверен, как он будет использоваться в этом случае. Возьмите первый чек в коде выше
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??";
...
Как я могу добиться того, чего я хочу, или я просто перегрузить метод?
Большое спасибо за помощь.
В вашем втором блоке кода это выглядит как условие ошибки. Не было бы более уместным «бросать новое ArgumentException()»? Что касается других возвратов, сделайте то, что предлагает Хайнци. –
+1 Я не уверен в этом случае. Иногда яснее определить причину ошибки самостоятельно как Exception.Message иногда может быть загадочным для пользователя. Однако, сказав, что я не уверен, что это один из таких случаев. Спасибо за ваше время ... – MoonKnight
Я согласен с Джесси - если вам не удается найти или вызвать метод, вы должны бросить. Пользователь должен ожидать, что возвращение подразумевает успех. Управляемый мир использует исключение для сообщения об ошибках, подобных этому. Неспециализированные возвращения. – payo