2010-06-27 2 views
10

У меня есть пользовательский элемент управления, который имеет дело с файловой загрузкой. Я определил делегата следующим образом:Как объявить общее событие для общего делегата в C#

public delegate void FileUploadSuccess<T>(T value,FileUploadType F) 

Значение может быть строкой, а также массивом байтов. FileUploadType - это перечисление, в котором указывается, какой тип файла был загружен.

Теперь я объявил событие в usercontrol, чтобы поднять это.

public event FileUploadSuccess<string> successString; //In case I want a file name 

public event FileUploadSuccess<Byte[]> successStringImage; // In case I want a byte[] of uploaded image 

То, что я хотел было родовое событие

public event FileUploadSuccess<T> successString. 

ответ

14

За исключением части общих типов (т.е.

class Foo<T> { public event SomeEventType<T> SomeEventName; } 

) нет такого понятия, как общие свойства, поля, события, индексаторов или операторов (только общих типов и универсальных методов). Может ли содержащийся тип быть общим?

+0

+1 , полный ответ. –

4

Для внешнего мира, событие, во многом выглядит как поле класса. Так же, как вы не можете использовать открытый родовой тип для объявления поля, вы не можете использовать открытый общий тип для объявления события.

Если вы можете оставить тип открытым, компилятор должен будет скомпилировать в обработчике события добавление и удаление кода для каждого возможного типа для вашего общего параметра T. Закрытый общий тип не может быть скомпилирован JIT, потому что ваше событие не является типом в своем собственном праве, а является частью замкнутого типа.

0

Я не думаю, что это возможно.

Событие похоже на экземпляр делегата (грубо говоря), а экземпляр представляет собой конкретную реализацию (общего или не общего класса).

Для лучшего понимания делегатов и событий вы можете обратиться к обсуждению this SO.

3

Это невозможно, если вы не определяете свой параметр типа в классе-оболочке. Например:

public delegate void FileUploadSuccess<T>(T value, FileUploadType F) 

public class FileUploader<T> 
{ 
    public event FileUploadSuccess<T> FileUploaded; 
} 

Но это перемещает только вашу проблему в другое место, так как теперь вы должны объявить два экземпляра класса FileUploader:

FileUploader<string> stringUploader = new FileUploader<string>(); 
FileUploader<byte[]> stringUploader = new FileUploader<byte[]>(); 

Это не может быть то, что вы хотите.

1

Зачем вам общее событие? Разве вы не можете просто использовать нормальное событие:

public delegate void FileUploadSuccess(object value); 

, а затем

public event FileUploadSuccess Success; 

В обработчик событий успеха вы будете знать тип объекта передается:

public void SuccessHandler(object value) 
{ 
    // you know the type of the value being passed here 
} 
+2

Сэр, я хотел сделать его безопасным и подумать, если дженерики могут помочь. – Rohit

Смежные вопросы