C # Передать тип в метод для оценки в операторе "is"? - PullRequest
3 голосов
/ 14 января 2011

Я хочу сделать что-то вроде кода, указанного ниже.По сути, я хочу иметь возможность создавать объект, но в то же время необязательно ставить требование интерфейса

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");

}

Приведенный выше код не компилируется из-за проблем с InterfaceRequirement

сейчасЯ знаю, что могу сделать это с помощью обобщений:

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");
}

, но с обобщениями требование к интерфейсу не является обязательным.Первый пример кода, где я передаю тип в качестве параметра, не компилируется, и я не вижу правильного синтаксиса.Кто-нибудь знает способ сделать это без генериков, чтобы я мог сделать его необязательным?

Ответы [ 2 ]

5 голосов
/ 14 января 2011

Вы можете проверить typeof(InterfaceRequirement).IsAssignableFrom(theType)?

В противном случае, возможно theType.GetInterfaces() и поищите его.

(где Type theType = NewControl.GetType();)

1 голос
/ 14 января 2011

Вы должны использовать ограничение для T:

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 Марио

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...