2011-01-31 13 views
5

Czy to możliwe bez refleksji inaczej z odbiciem? Jest to bardzo często używane w PHP, np. W Wordpress.Jak wywołać metodę C# tylko, jeśli istnieje?

Coś w pseudo kod:

if (exists(object.method)) {object.method} 

lub

try {object.method} finally {...} 
+0

Co masz na myśli –

+1

Nawet z myślą o odbiciu, trzeba wziąć pod uwagę prototyp metody: 'int Foo (string string)' to nie to samo co 'double Foo (int bar, IDictionary quux)'. –

+1

Szukasz częściowych metod? http://msdn.microsoft.com/en-us/library/6b0scde8.aspx – Ani

Odpowiedz

6

Można użyć dynamikę i złapać wyjątek Runtime:

dynamic d = 5; 
try 
{ 
    Console.WriteLine(d.FakeMethod(4)); 
} 
catch(RuntimeBinderException) 
{ 
    Console.WriteLine("Method doesn't exist"); 
} 

Choć brzmi to bardziej jak problem projektowania.

Zastrzeżone
Kod ten nie jest przeznaczony do użytku, tylko przykładem, że można to zrobić.

+0

przykładowy kod Nie znam dynamiki? – user310291

+0

wydaje się, czego chcę. – user310291

+13

Używanie wyjątków do kontroli przepływu jest nieprzyjemne, Nasty, NASTY. – jason

16

Cóż, można zadeklarować w interfejsie, a następnie użyć:

IFoo foo = bar as IFoo; 
if (foo != null) 
{ 
    foo.MethodInInterface(); 
} 

który zakłada można zrobić rzeczywisty typ obiektu implementuje interfejs.

W przeciwnym razie należy użyć odbicia AFAIK.

(EDIT:. Dynamiczne typowanie wymienionych gdzie indziej będzie działać na platformie .NET 4 też, oczywiście ... ale połowu wyjątek dla to dość paskudny IMO)

+2

+1 Korzystanie z interfejsu jest najczystszym sposobem. – Rauhotz

+0

Ewentualna optymalizacja wydajności, jeśli nie jest to możliwe, to skorzystanie z refleksji i wygenerowanie dynamicznej metody optymalizacji przyszłych połączeń. – Mehrdad

+0

Zbyt ciężki w kontekście, którego chcę użyć: to około 50 metod, gdybym musiał stworzyć interfejs dla każdej metody ... – user310291

1

Należy zrewidować pierwszy existance. MethodInfo[] myArrayMethodInfo = myType.GetMethods();

4

Z dynamic wpisać w C# 4.0, ty mógłby zrobić coś takiego:

dynamic obj = GetDynamicObject(); 
if (obj != null && obj.GetType().GetMethod("DoSomething") != null) 
{ 
    obj.DoSomething(); 
} 

ale jedynym sposobem, aby stwierdzić, czy typ ma metodę na pierwszym miejscu jest użycie refleksji; więc powyższe podejście tak naprawdę niczego nie kupuje (równie dobrze można uzyskać MethodInfo, które można uzyskać, dzwoniąc pod numer GetMethod i po prostu Invoke).

Edit: Jeśli jesteś otwarty na próby wywołania metody, nawet jeśli go nie ma, to Yuriy's answer jest prawdopodobnie to, czego szukasz. Moja oryginalna odpowiedź była dosłowną odpowiedzią na sposób, w jaki sformułowałeś swoje pytanie: "Jak wywołać metodę C# tylko wtedy, gdy istnieje."

1

Natrafiłem na to, szukając tej samej odpowiedzi, ale nie lubiłem żadnego z rozwiązań.

tutaj jest moje: „tylko wtedy, gdy istnieje”

//Invoke the refresh method if the datasource contains it 
if (this.DataSource.GetType().GetMethod("Refresh") != null) 
    this.DataSource.GetType().GetMethod("Refresh").Invoke(this.DataSource, new object[] { }); 
Powiązane problemy