Laden...

[gelöst] Typangaben generischer Methoden per Reflection füllen

Erstellt von pinki vor 10 Jahren Letzter Beitrag vor 10 Jahren 557 Views
pinki Themenstarter:in
709 Beiträge seit 2008
vor 10 Jahren
[gelöst] Typangaben generischer Methoden per Reflection füllen

Hallo,
ich würde gerne eine generische Methode, die zwei Typangaben benötigt und zudem noch überladen ist per Reflection füllen. Wie das mit einer Typangabe funktioniert habe ich schon herausgefunden, jedoch bekomme ich es nicht hin mehrere Typangaben zu setzen.

Kann mir bitte einer von euch sagen, wie das geht?

pinki

S
417 Beiträge seit 2008
vor 10 Jahren

Hallo,

meinst du mit mehreren Typangaben so etwas in der Art?

class Program
{
	static void Main(string[] args)
	{
		var mi = typeof(Program).GetMethods().Where(f => f.Name == "DoIt" && f.GetGenericArguments().Length == 2).FirstOrDefault();

		if (mi != null)
		{
			mi = mi.MakeGenericMethod(typeof(string), typeof(int));

			var res = mi.Invoke(new Program(), new object[] { "Hello", 123 });

			Console.WriteLine(res.ToString());
		}
	}

	public A DoIt<A, B>(A a, B b)
	{
		return a;
	}

	public C DoIt<A, B, C>(A a, B b, C c)
	{
		return c;
	}
}
pinki Themenstarter:in
709 Beiträge seit 2008
vor 10 Jahren

Hallo Sarc,

Genau so.
Besten Dank! 👍

Das war viel einfacher als ich dachte. =)

Ich hatte vor die Register<TInterface, TClass>-Methode des ISimpleIoc aus dem MVVM light Framework dynamisch zu füllen.

So ist das dann geworden:

Type[] typesToLookFor = new Type[] { typeof(IModel) };

ISimpleIoc ioc = SimpleIoc.Default;

MethodInfo methodInfo = ioc.GetType()
	                       .GetMethods()
	                       .Where(m => m.Name == "Register" &&
							           m.GetGenericArguments().Length == 2 &&
									   m.GetParameters().Length == 0)
						   .FirstOrDefault();

foreach (Type interfaceType in typesToLookFor) {
	Type implementationType = TypeLister.GetExternalTypesThatImplement(interfaceType).FirstOrDefault();
	if (implementationType == null) throw new ImplementationNotFoundException(interfaceType);

	MethodInfo registerCallInfo = methodInfo.MakeGenericMethod(interfaceType, implementationType);
	registerCallInfo.Invoke(ioc, null);
}