2010-06-27 2 views
10

fileupload를 다루는 사용자 정의 컨트롤이 있습니다. 다음과 같이 대리인을 정의했습니다.C에서 일반 대리인에 대한 일반 이벤트를 선언하는 방법 #

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

값은 문자열 및 바이트 배열 일 수 있습니다. FileUploadType은 업로드 된 파일 유형을 알려주는 enum입니다.

이제는 이것을 발생시키기 위해 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

둘러싼 클래스에서 유형 매개 변수를 정의하지 않으면 불가능합니다.

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

이 당신이 원하는하지 않을 수 있습니다 예를 들어 : 지금 당신이 FileUploader 클래스의 두 인스턴스를 선언해야하기 때문에

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

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

는 그러나 이것은 단지, 다른 위치로 문제를 이동합니다.

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