2013-05-03 8 views
6

Dane:jak przekazać działanie <in T> z klasą pochodną jako parametrem Akcja?

class BaseClass {} 
class DerivedClass : BaseClass {} 

Chcę napisać funkcję, która może przyjąć działania z parametrem klasy bazowej. Funkcja utworzy obiekt określonego typu i przekaże go do Akcji.

void MyFunction(Type type, Action<BaseClass> DoAction) 
{ 
    BaseClass obj = (BaseClass)Activator.CreateInstance(type); 
    DoAction(obj); 
} 

Chcę przekazać w AnotherFunction którego parametr jest DerivedClass:

void AnotherFunction(DerivedClass x) 
{ 
} 

Jak mam nazwać MyFunction? Poniższy jest nieważny ze względu na argument AnotherFunction:

MyFunction(typeof(DerivedClass), AnotherFunction); 

Odpowiedz

11

Jeśli to możliwe, spróbuj zamiast tego użyć rodzajowych:

void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new() 
{ 
    DoAction(new T()); 
} 

Następnie można po prostu napisać:

MyFunction<DerivedClass>(AnotherFunction); 

Będzie :

  • Wykonaj kompilację sprawdzania czasu aby upewnić się, że używany typ to BaseClass lub typ pochodzący z niego. Nie otrzymasz błędów runtime, ponieważ typ nie rozszerza się o BaseClass.
  • Dokonaj kompilacji sprawdzania czasu, aby upewnić się, że typ ma konstruktor bez parametrów, zamiast rzucać wyjątek w czasie wykonywania, jeśli taki nie istnieje.
  • Dokonaj kompilacji sprawdzania czasu, aby upewnić się, że metoda podana dla Action akceptuje parametr odpowiedni dla użytego typu, zamiast rzucać wyjątek w czasie wykonywania, jeśli typ nie jest odpowiedni.
+0

+1 Pobiłeś mnie do mojej edycji. –

+1

Myślę, że MyFunction (AnotherFunction) nie skompiluje się bez jawnego określenia ogólnego typu argumentu. – jure

+0

@jure Masz rację, nie można wywnioskować typu. – Servy

Powiązane problemy