我試圖調用使用Reflection
一類的功能(假設對象初始化作爲功能不依賴於被調用)這樣調用成員
/// <summary>
/// Calls a static public method.
/// Assumes that the method returns a string
/// </summary>
/// <param name="assemblyName">name of the assembly containing the class in which the method lives.</param>
/// <param name="namespaceName">namespace of the class.</param>
/// <param name="typeName">name of the class in which the method lives.</param>
/// <param name="methodName">name of the method itself.</param>
/// <param name="stringParam">parameter passed to the method.</param>
/// <returns>the string returned by the called method.</returns>
///
public static string InvokeStringMethod5(string assemblyName, string namespaceName, string typeName, string methodName, string stringParam)
{
//This method was created incase Method has params with default values. If has params will return error and not find function
//This method will choice and is the preffered method for invoking
// Get the Type for the class
Type calledType = Type.GetType(String.Format("{0}.{1},{2}", namespaceName, typeName, assemblyName));
String s = null;
// Invoke the method itself. The string returned by the method winds up in s.
// Note that stringParam is passed via the last parameter of InvokeMember, as an array of Objects.
if (MethodHasParams(assemblyName, namespaceName, typeName, methodName))
{
s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
null,
null,
new Object[] { stringParam });
}
else
{
s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
null,
null,
null);
}
// Return the string that was returned by the called method.
return s;
}
public static bool MethodHasParams(string assemblyName, string namespaceName, string typeName, string methodName)
{
bool HasParams;
string name = String.Format("{0}.{1},{2}", namespaceName, typeName, assemblyName);
Type calledType = Type.GetType(name);
MethodInfo methodInfo = calledType.GetMethod(methodName);
ParameterInfo[] parameters = methodInfo.GetParameters();
if (parameters.Length > 0)
{
HasParams = true;
}
else
{
HasParams = false;
}
return HasParams;
}
這是取自here。
有沒有其他的/更好的方法來做到這一點?
這個活動可以是通用的嗎?與使用Dynamic
類似,可以在.Net 4.0中調用Non-Static methods
,以便返回類型可以獨立。
我從來沒有在實際場景中使用dynamic
關鍵字(只讀一些例子)來actul使用還是未知數我
在這方面的任何幫助/方向,將不勝感激 感謝
爲了能有你的方法返回任何類型,要麼返回'object'(這是反射庫中大多數方法已經做到的),要麼使用泛型方法。 –
@ C.Evenhuis將泛型和反射結合起來通常不會有用 –
@MarcGravell我並不是說應該使用反射來調用泛型方法,而只是在將結果傳遞給調用方之前將結果轉換爲所需類型。我的印象是,「動態」和「通用」這兩個術語在這個問題上混在一起。 –