开发者

How to access custom attributes defined in WCF service using C#?

First question is, how can I get the type of an object stored in a variable? Generally we do:

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

but, how can I say something:

Type t = typeof(varClassName);开发者_高级运维 //if the class name is stored in a variable

Second question, a broader picture is, I have a WCF service that contains a DataContract class say "MyClass" and I have defined a custom attribute called "MyAttribute" to it. There is one method say "GetDataUsingDataContract" with a parameter of type MyClass. Now on client, I invoke the webservice. I use MethodInfo and ParameterInfo classes to get the parameters of the method in question. But how can I access the attributes of the method parameter which is actually a class Myclass? Here is the code that I tried:

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);
}

Above code doesn't retrieve me the custom attribute "MyAttribute". I tried the concept in the class that is defined in the same project and it works. Please HELP!


but, how can I say something: Type t = typeof(varClassName); //if the class name is stored in a variable

Try

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

As to your second question:

Above code doesn't retrieve me the custom attribute "MyAttribute". I tried the concept in the class that is defined in the same project and it works. Please HELP!

Just guessing, I'm not sure that attributes are exposed to the client, by default. I think its the same issue as an untrusted assembly. Some attributes are sensitive info. See this:

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

But you could try linking the service project types into your app by first referencing the service assembly in your client project, then going to your service reference -> "Configure Service Reference" and selecting "Reuse types in all referenced assemblies". I'm not sure this option will affect the service interface classes, but I use it often with my domain objects. Worth a try.


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

Ensure your proxy class has knowledge on attributes

Hope this will help

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜