Edytuj:Wywołanie metody ogólnej z argumentem typu znanym tylko w czasie wykonywania
Oczywiście mój prawdziwy kod nie wygląda dokładnie tak. Próbowałem napisać pół-pseudo-kod, aby uczynić go bardziej jasnym od tego, co chciałem zrobić.
Wygląda na to, że po prostu coś pomieszało.
Więc co tak naprawdę chciałby zrobić to w ten sposób:
Method<Interface1>();
Method<Interface2>();
Method<Interface3>();
...
Cóż ... Pomyślałem, że może mógłbym zamienić go w pętli przy użyciu odbicia. Pytanie brzmi: jak mam to zrobić. Mam bardzo słabą wiedzę o odbiciu. Przykłady kodu byłyby świetne.
Scenariusz wygląda następująco:
public void Method<T>() where T : class
{}
public void AnotherMethod()
{
Assembly assembly = Assembly.GetExecutingAssembly();
var interfaces = from i in assembly.GetTypes()
where i.Namespace == "MyNamespace.Interface" // only interfaces stored here
select i;
foreach(var i in interfaces)
{
Method<i>(); // Get compile error here!
}
Original post:
Cześć!
Próbuję pętli wszystkich interfejsów w obszarze nazw i wysłać je jako argumenty do ogólnego sposobu jak ten:
public void Method<T>() where T : class
{}
public void AnotherMethod()
{
Assembly assembly = Assembly.GetExecutingAssembly();
var interfaces = from i in assembly.GetTypes()
where i.Namespace == "MyNamespace.Interface" // only interfaces stored here
select i;
foreach(var interface in interfaces)
{
Method<interface>(); // Get compile error here!
}
}
Błąd pojawia jest „Nazwa typu oczekiwaniami, ale nazwa lokalna zmienna znaleziono ". Gdy próbuję
...
foreach(var interface in interfaces)
{
Method<interface.MakeGenericType()>(); // Still get compile error here!
}
}
otrzymuję „nie można zastosować operatora«<»do argumentów typu«grupa metoda»i«System.Type»” Każdy pomysł, jak obejść ten problem?
Chciałbym stub metoda rodzajowa, w oparciu o typ. Ale jeśli zrobię to za pomocą refleksji, a następnie odgadnę wygenerowany, zrozumieją, że nie będzie to, co chcę. Zgaduję, że to niemożliwe? Albo to jest? Stub ogólny sposób dla wszystkich typów na liście ... –
@Stephane: Trudno jest dokładnie określić, co próbujesz zrobić. Proponuję zadać nowe pytanie z większą ilością szczegółów. –
Uwaga: możesz uzyskać "Niejednoznaczne dopasowanie w rozdzielczości metody" na 'GetMethod()'. Dzieje się tak, gdy metoda, którą próbujesz uzyskać, ma pewne przeciążenia. Musisz więc określić, który z nich chcesz, używając 'GetMethod (" Name ", new Type [] {arguments})' – cvsguimaraes