2011-01-05 74 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。現在在客戶端上,我調用了web服務。我使用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」 。 I 嘗試了在同一個項目中定義的 和 工作的類中的概念。請幫忙!

只是猜測,我不知道默認情況下,屬性暴露給客戶端。我認爲它與未受信任的程序集相同。一些屬性是敏感信息。看到這一點:

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

但你可以嘗試先引用您的客戶端項目的服務組裝,然後將你的服務參考鏈接服務項目類型爲你的應用程序 - >「配置服務引用」,並選擇「在所有引用的程序集中重用類型」。我不確定這個選項會影響服務接口類,但是我經常使用它與我的域對象。值得一試。

+0

在生產中我其實在飛行中創建代理(動態):/ /.../xyzService.svc)。我沒有服務項目。這是由第三方(另一組)提供的服務。在那種情況下,我怎樣才能配置? – 2011-01-05 19:11:14

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

確保您的代理類具有使用URI(HTTP上的屬性知識

希望這將有助於

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 2011-01-05 18:13:28

+0

我也有同樣的問題,我們如何確保代理類具有屬性的知識? – 2011-01-05 19:12:04

+0

所有屬性必須位於引用客戶端的庫中,並在生成的代理類中手動添加屬性。更好的方法是使用接口進行數據合同,並使用接口 – hungryMind 2011-01-06 09:31:43