Как получить доступ к пользовательским атрибутам, определенным в службе WCF, используя C #? - PullRequest
0 голосов
/ 05 января 2011

Первый вопрос: как я могу получить тип объекта, хранящегося в переменной? Обычно мы делаем:

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

но как я могу что-то сказать:

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

Второй вопрос, более общая картина, у меня есть служба WCF, которая содержит класс DataContract, скажем, «MyClass», и я определил для него собственный атрибут 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". Я попробовал концепцию в классе, который определен в том же проекте, и он работает. Пожалуйста, ПОМОГИТЕ!

Ответы [ 2 ]

1 голос
/ 05 января 2011

но как я могу что-то сказать: Type t = typeof (varClassName);// если имя класса хранится в переменной

Попробуйте

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

По второму вопросу:

Код выше ненайдите мне пользовательский атрибут "MyAttribute".Я попробовал концепцию в классе, который определен в том же проекте, и он работает.Пожалуйста, ПОМОГИТЕ!

Просто угадайте, я не уверен, что атрибуты выставляются клиенту по умолчанию.Я думаю, что это та же проблема, что и ненадежная сборка.Некоторые атрибуты являются конфиденциальной информацией.Смотрите это:

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

Но вы можете попробовать связать типы проектов сервисов с вашим приложением, сначала сделав ссылку на сборку сервиса в вашем клиентском проекте, а затем перейдя к ссылке на сервис -> "Настроить ссылку на сервис »и выбрать« Повторное использование типов во всех сборках, на которые есть ссылки ».Я не уверен, что эта опция повлияет на классы интерфейса службы, но я часто использую ее с моими объектами домена.Стоит попробовать.

0 голосов
/ 05 января 2011
 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;
        }
    }
}
...