Эта topi c может быть понятнее как How to get MethodInfo with many overloading functions and complicated parameter
.
Я предполагаю, что вы проанализировали документацию XML успешно и получили строку, подобную этой
NetCoreScripts.StackOverFlow.ReflectionTopic.MyObject(System.String,System.String,System.Boolean)
Там вы можете использовать любой метод разделителя для разделения на 2 элемента:
Первый: NetCoreScripts.StackOverFlow.ReflectionTopic.MyObject
Второй массив: System.String
, System.String
, System.Boolean
(3 параметры должны быть в том же порядке)
private static Type[] ToTypeArray(string[] typeNames)
{
var types = new List<Type>();
foreach (string name in typeNames)
{
types.Add(Type.GetType(name));
}
return types.ToArray();
}
Я повторно использую ваш ToTypeArray и создаю модель
namespace NetCoreScripts.StackOverFlow.ReflectionTopic
{
public class MyObject
{
public void DoMore(int parameter) { }
public void DoMore(string str1, string str2, bool bool1) { }
public void DoMore(string str, int num) { }
public void DoMore(List<string> parameter) { }
public void DoMore(List<string> parameter, int param) { }
public void DoMore(List<List<string>> parameter, bool? nullableBool, bool isTrue) { }
}
}
Основной метод вызова будет
public static void GetMyMethod(Type type, string[] arr)
{
var parammeters = ToTypeArray(arr);
var method = type.GetMethod("DoMore", parammeters);
Console.WriteLine(method.Name);
}
public static void MainFunc()
{
var type = Type.GetType("NetCoreScripts.StackOverFlow.ReflectionTopic.MyObject");
GetMyMethod(type, new string[] { "System.Int32" });
GetMyMethod(type, new string[] { "System.String", "System.String", "System.Boolean" });
GetMyMethod(type, new string[] { "System.String", "System.Int32" });
GetMyMethod(type, new string[] { "System.Collections.Generic.List`1[[System.String]]" });
GetMyMethod(type, new string[] { "System.Collections.Generic.List`1[[System.String]]", "System.Int32" });
GetMyMethod(type, new string[] { "System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.String]]]]", "System.Nullable`1[[System.Boolean]]", "System.Boolean" });
}
Чтобы точно знать там имя, я предлагаю использовать полное имя при парном тестировании, писать и читать Xml будет проще
Console.WriteLine(typeof(bool?).FullName);
//System.Nullable`1[[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
Console.WriteLine(Type.GetType("System.Nullable`1[[System.Boolean]]").FullName);
//For shorter
Надеюсь, это поможет