Как вы указываете передать тип, который имеет определенный интерфейс? - PullRequest
2 голосов
/ 27 февраля 2009

У меня есть метод, в котором я хочу иметь параметр типа Type, но с определенным интерфейсом.

например:.

public static ConvertFile(Type fileType)

где я могу указать, что fileType наследует IFileConvert.

Возможно ли это?

Ответы [ 5 ]

4 голосов
/ 27 февраля 2009

Один из вариантов - дженерики:

public static ConvertFile<T>() where T : IFileConvert
{
     Type type = typeof(T); // if you need it
}

и звоните как:

ConvertFile<SomeFileType>();
3 голосов
/ 27 февраля 2009

Нет, это невозможно. Однако вы можете сделать:

public static void ConvertFile<T>() where T : IFileConvert {
   Type fileType = typeof(T);
}

вместо.

1 голос
/ 27 февраля 2009

Если вы хотите применить это во время компиляции, дженерики являются единственным способом:

public static ConvertFile<T>(T fileType)
    where T : IFileType

Чтобы проверить во время выполнения, вы можете сделать:

Debug.Assert(typeof(IFileType).IsAssignableFrom(fileType));
0 голосов
/ 27 февраля 2009

Расширяя ответ Марка. Он прав, без обобщений нет способа применить это во время компиляции. Если вы не можете или не хотите использовать дженерики, вы можете добавить проверку выполнения следующим образом.

public static void ConvertFile(Type type) {
  if ( !typeof(IFileType).IsAssignableFrom(type)) {
    throw new ArgumentException("type");
  }
  ...
}
0 голосов
/ 27 февраля 2009

Разве вы не можете просто сделать:

public static ConvertFile(IFileConvert fileType)
...