2011-12-27 4 views
2

변수를 통해 인터페이스 이름을 할당합니다. 변수를 통해 인터페이스를 호출해야합니다. 즉, ChannelFactory 클래스에서만 인터페이스를 허용해야합니다. 직접 인터페이스를 ChannelFactory에서 Test로 지정하면 잘 작동합니다. .변수 이름을 사용하여 인터페이스를 호출

string interfaceName = "Test"; 
var factory = new ChannelFactory<**interfaceName**>(new BasicHttpBinding(), new EndpointAddress(*********)); 

문자열 변수에서 인터페이스로 타입 변환하는 방법을 제안하십시오.

답변

1

우선 : 그럴 수 없습니다! 귀하의 코드 라인

var factory = new ChannelFactory<interfaceName>(new BasicHttpBinding(), new EndpointAddress(***)); 

가 (유형 var의) 그 공장을 제안 할 수는 변형이지만 없습니다. 이것은 변수이며 유형이 안전하며 new ChannelFactory<interfaceName>이라는 일반 호출로 인해 컴파일러에서 작성됩니다. 따라서 일반적인 호출에서 변수 인터페이스를 지정할 수 없습니다.

5

문자열 변수에서 인터페이스로 직접 유형 변환 할 수 없습니다. 그러나 리플렉션을 사용하여 제네릭 형식을 만들 수 있습니다.

하면 결과 공장, 개체 형식 수 있으므로 또한 저점 반사를 수행 (또는 ChannelFactory에 생성됩니다 다음 코드를 dynamic keyword)

을 사용하여되어야 할 것이다에있는 모든 인터페이스 메소드를 호출 할 것이다, 그러나주의 저점 반사하지만 결과는 당신이 그것을 직접 채널 메소드를 호출 할 수 없습니다 의미, 개체 형식입니다 볼 수 있습니다.

string interfaceName = "StackOverflow.ITest"; 

Type f = typeof (ChannelFactory<>); 
Type[] typeargs = {Type.GetType(interfaceName, true)}; 

Type constructed = f.MakeGenericType(typeargs); 
object factory = Activator.CreateInstance(constructed); 
+0

마지막 행을'var factory = Activator.CreateInstance (constructed)로 변경하면 ChannelFactory;로 변경되지만 IDE에 몇 가지 기본 채널 기능이 유지됩니다. – flindeberg

1

당신은 일반적인 제약에서 문자열로 인터페이스 이름을 전달할 수 없습니다. 당신은

아래의 작업을 수행 할 수 있습니다
string interfaceName = "Test"; 
Type myInterfaceType = Type.GetType(interfaceName); 
var factoryType = typeof(ChannelFactory<>).MakeGenericType(myInterfaceType); 
var factoryCtr = factoryType.GetConstructor(new []{ typeof(Binding), typeof(EndpointAddress)}); 
ChannelFactory factory = factoryCtr.Invoke(new object[]{ new BasicHttpBinding(), new EndpointAddress("")}) as ChannelFactory; 
0

Fischermaen의 답변에서 두 번째로 이어지는 도 그럴 수 없습니다!

일반적인 유형의 입력 인수 목록 (각괄호 내의 유형 이름은 예를 들면, List<int>에서 "INT") 변수 아니다. 그것들은 정적 인 컴파일 타임 토큰입니다. 당신은 더 이상 당신이해야 할 찾는 것보다이 작업을 수행 할 수 없었다 : C 번호는 정적 타입 언어가

string className = "FileInfo"; 
**className** theObject = new **className**("C:\\autoexec.bat"); 

때문에, 타입 이름 토큰으로 표시 유형은 정적으로 컴파일시에 알려 져야한다. 여기에 반영 기반 응답은 고정 유형이 ChannelFactory<TChannel>의 하위 유형 인 참조로 남겨 둡니다. 비제 제 ChannelFactory 또는 object입니다. 런타임에만 알 수있는 유형에 대한 정적 컴파일 시간 참조를 가질 수 없습니다.

관련 문제