2011-01-14 14 views
3

Ich möchte etwas wie den unten aufgeführten Code tun. Im Grunde möchte ich in der Lage sein, ein Objekt zu schaffen, sondern gleichzeitig die optional auf einer Schnittstelle Anforderung stellteC# Übergeben Sie einen Typ an eine Methode, die in einer "is" -Anweisung ausgewertet werden soll?

public UserControl CreateObject(string objectName, Type InterfaceRequirement) 
{ 
    ///// create object code abbreviated here 
    UserControl NewControl = createcontrol(objectName); 

    if (InterfaceRequirement == null || NewControl is InterfaceRequirement) 
      return NewControl; 
    else 
      throw new SystemException("Requested object does not implement required interface"); 

} 

Der obige Code nicht kompilieren, weil Probleme mit InterfaceRequirement

jetzt, ich weiß, ich kann dies mit Generika machen:

public UserControl CreateObject<T>(string objectName) 
{ 
    ///// create object code abbreviated here 
    UserControl NewControl = createcontrol(objectName); 

    if (NewControl is T) 
      return NewControl; 
    else 
      throw new SystemException("Requested object does not implement required interface"); 
} 

aber mit den Generika ist die Schnittstellenanforderung nicht optional. Das erste Codebeispiel, in dem ich Typ als Parameter übergebe, kompiliert nicht, und ich kann nicht sehen, um die Syntax richtig zu machen. Kennt jemand einen Weg, dies ohne Generika zu tun, damit ich es optional machen kann?

Antwort

5

Sie können überprüfen typeof(InterfaceRequirement).IsAssignableFrom(theType)?

Ansonsten, vielleicht theType.GetInterfaces() und suchen Sie danach.

(wo Type theType = NewControl.GetType();)

+0

Sie direkt mit einer wenig Anpassung an Ihren Code war: InterfaceRequirement.IsAssignableFrom (NewControl. GetType()); – leifre

1

Sie haben eine Einschränkung für T verwenden:

public UserControl CreateObject<T>(string objectName) where T : class 
{ 
    ///// create object code abbreviated here 
    UserControl NewControl = createcontrol(objectName); 

    if (NewControl is T) 
      return NewControl; 
    else 
      throw new SystemException("Requested object does not implement required interface"); 
} 

hth Mario

+0

Die Methode, die das OP hat Problem mit scheint die nicht-generische sein ... –

+0

Die generische funktioniert gut und in diesem Fall ist es wirklich zu erzwingen Sub-Schnittstellen für eine Fabrik Erstellung, wenn es notwendig ist, aber dies ist so Generika optional Arent ist wirklich der Weg zu gehen, es sei denn, ich möchte eine generische und nicht generische Methode – leifre

+0

Entschuldigung, falsch gelesen Ihren Beitrag! –

Verwandte Themen