반응형
C #은 System.Type을 Generic 매개 변수로 사용합니다.
데이터베이스에서 쿼리해야하는 유형 (System.Type) 목록이 있습니다.
이 유형 각각에 대해 다음 확장 메서드 (LinqToNhibernate의 일부)를 호출해야합니다.
Session.Linq<MyType>()
그러나 MyType이 없지만 대신 Type을 사용하고 싶습니다.
내가 가진 것은 :
System.Type typeOne;
그러나 다음을 수행 할 수 없습니다.
Session.Linq<typeOne>()
유형을 일반 매개 변수로 어떻게 사용할 수 있습니까?
직접 할 수는 없습니다. 제네릭의 요점은 컴파일 타임에 관심있는 유형을 알고 해당 유형의 인스턴스로 작업 할 수있는 컴파일 타임 유형 안전성 을 제공 하는 것입니다. 귀하의 경우에는을 알고 Type
있으므로 보유한 객체가 해당 유형의 인스턴스인지 컴파일 타임 검사를받을 수 없습니다.
다음과 같이 리플렉션을 통해 메서드를 호출해야합니다.
// Get the generic type definition
MethodInfo method = typeof(Session).GetMethod("Linq",
BindingFlags.Public | BindingFlags.Static);
// Build a method with the specific type argument you're interested in
method = method.MakeGenericMethod(typeOne);
// The "null" is because it's a static method
method.Invoke(null, arguments);
이 유형을 많이 사용해야하는 경우 필요한 다른 제네릭 메서드를 호출하는 고유 한 제네릭 메서드를 작성한 다음 리플렉션을 사용 하여 메서드 를 호출하는 것이 더 편리 할 수 있습니다 .
이렇게하려면 리플렉션을 사용해야합니다.
typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null);
( Linq<T>()
유형에 대한 정적 메서드 라고 가정 Session
)
경우 Session
실제로 객체가 , 당신은 어디에서 알아야 할 Linq
방법이 실제로 선언과에 합격 Session
인수로 :
typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne)
.Invoke(null, new object[] {Session});
참고 URL : https://stackoverflow.com/questions/4667981/c-sharp-use-system-type-as-generic-parameter
반응형
'developer tip' 카테고리의 다른 글
jQuery 플러그인을 확장하는 가장 좋은 방법 (0) | 2020.10.17 |
---|---|
Android 데이터베이스 암호화 (0) | 2020.10.17 |
Facebook API 오류 191 (0) | 2020.10.17 |
REST API-단일 요청으로 대량 생성 또는 업데이트 (0) | 2020.10.17 |
Pandas 데이터 프레임에서 셀을 NaN으로 설정하는 방법 (0) | 2020.10.17 |