developer tip

C #은 System.Type을 Generic 매개 변수로 사용합니다.

optionbox 2020. 10. 17. 10:24
반응형

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

반응형