2011-01-05 2 views
0

첫 번째 질문은 변수에 저장된 개체 유형을 어떻게 얻을 수 있습니까? 일반적으로 우리가 할 : 내가 말할 수있는 방법,C#을 사용하여 WCF 서비스에 정의 된 사용자 지정 특성에 액세스하는 방법?

Type t = typeof(ClassName); //if I know the class 

하지만 뭔가 :

Type t = typeof(varClassName); //if the class name is stored in a variable 

두 번째 질문, 더 넓은 그림이다, 나는를 DataContract 클래스 "MyClass에"말을 내가 포함 된 WCF 서비스가 "MyAttribute"라는 사용자 정의 속성을 정의했습니다. 한 가지 방법으로 "GetDataUsingDataContract"라는 매개 변수와 MyClass 유형이 있습니다. 이제 클라이언트에서 웹 서비스를 호출합니다. 나는 MethodInfo와 ParameterInfo 클래스를 사용하여 해당 메소드의 매개 변수를 가져온다. 하지만 실제로 클래스 Myclass 인 메서드 매개 변수의 특성에 어떻게 액세스 할 수 있습니까? 코드 위

MyService.Service1Client client = new MyService.Service1Client(); 
Type t = typeof(MyService.Service1Client); 
MethodInfo members = t.GetMethod("GetDataUsingDataContract"); 
ParameterInfo[] parameters = members.GetParameters(); 
foreach (var parameter in parameters) 
{ 
    MemberInfo mi = parameter.ParameterType; //Not sure if this the way 
    object[] attributes; 
    attributes = mi.GetCustomAttributes(true); 
} 

나에게 사용자 지정 특성 "MyAttribute"를 검색하지 않습니다 여기에 내가 노력 코드입니다. 나는 같은 프로젝트에 정의 된 클래스에서 개념을 시도하고 작동한다. 도와주세요!

답변

1

하지만 어떻게 말 할 수 있습니까? 유형 t = typeof (varClassName); // 클래스 이름이 변수

에 저장되어있는 경우 두 번째 질문에 관해서는

Type.GetType("varClassName", false, true); 

을 시도 나에게 사용자 지정 특성 "MyAttribute"를 검색하지 않는 코드 위

. 나는 같은 프로젝트에 정의 된 인 클래스에서 개념을 시도했으며 이 작동합니다. 도와주세요!

기본적으로 속성이 클라이언트에 노출되어 있는지 확실하지 않습니다. 나는 신뢰할 수없는 어셈블리와 같은 문제라고 생각합니다. 일부 속성은 민감한 정보입니다.

http://blogs.msdn.com/b/haibo_luo/archive/2006/02/21/536470.aspx

그러나 먼저 다음 서비스 참조에 가고, 클라이언트 프로젝트에서 서비스 어셈블리를 참조하여 응용 프로그램에 서비스 프로젝트 형식 연결을 시도 할 수 -> "구성 서비스 참조"를 선택 :이 참조 "참조 된 모든 어셈블리에서 유형 재사용". 이 옵션이 서비스 인터페이스 클래스에 영향을 미치는지 확신 할 수 없지만 도메인 객체에 자주 사용합니다. 한 번해볼 만하다./:

+0

도움이 될 것입니다 속성에 대한 지식 URI (HTTP를 사용하여이 확인 /.../xyzService.svc). 저는 봉사 프로젝트가 없습니다. 이것은 제 3 자 (다른 그룹)가 제공하는 서비스입니다. 이 경우 어떻게 구성 할 수 있습니까? –

0
Type mi = parameter.ParameterType; //Not sure if this the way 
object[] attributes; 
attributes = mi.GetCustomAttributes(true); 

하면 프록시 클래스가

희망이 실제로 (동적) 즉석에서 프록시를 만드는 오전 생산에서

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.ServiceModel; 
using System.Runtime.Serialization; 
using System.Reflection; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      StartService(); 
     } 

     string url = "http://localhost:234/MyService/"; 
     private void StartClient() 
     { 
      IMyService myService = ChannelFactory<IMyService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(url)); 
      Type t = typeof(IMyService); 
      MethodInfo members = t.GetMethod("MyMethod"); 
      ParameterInfo[] parameters = members.GetParameters(); 
      foreach (var parameter in parameters) 
      { 
       Type mi = parameter.ParameterType; 
       object[] attributes; 
       attributes = mi.GetCustomAttributes(true); 
      } 
     } 

     private void StartService() 
     { 
      ServiceHost host = new ServiceHost(typeof(MyService), new Uri(url)); 
      host.AddServiceEndpoint(typeof(IMyService), new BasicHttpBinding(), ""); 
      host.Open(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      StartClient(); 
     } 
    } 

    [AttributeUsage(AttributeTargets.Interface)] 
    public class MyAttrib : Attribute 
    { 
    } 

    [MyAttrib] 
    public interface IMyContract 
    { 
     string Name { get; set; } 
    } 

    [DataContract] 
    public class MyContract : IMyContract 
    { 
     [DataMember] 
     public string Name { get; set; } 
    } 

    [ServiceContract] 
    public interface IMyService 
    { 
     [OperationContract] 
     bool MyMethod(IMyContract dummy); 
    } 

    [ServiceBehavior(UseSynchronizationContext = false)] 
    public class MyService : IMyService 
    { 
     public bool MyMethod(IMyContract dummy) 
     { 
      return true; 
     } 
    } 
} 
+0

프록시 클래스에 그러한 지식이 있는지 확인하려면 어떻게합니까? 내가 방금 추측 한 나의 대답을 보라. 제가 틀렸다면 정답에 관심이 있으니 설명해주십시오. 감사! – codenheim

+0

나는 같은 질문을 가지고있다. 어떻게 프록시 클래스가 속성에 대한 지식을 가질 수 있을까? –

+0

모든 속성은 클라이언트를 참조하는 라이브러리에 있어야하며 생성 된 프록시 클래스에 속성을 수동으로 추가해야합니다. 더 나은 접근 방식은 인터페이스에 datacontracts를 사용하고 인터페이스에 속성을 사용하는 것입니다. – hungryMind