Как сделать экземпляр неизвестного класса для использования в качестве параметра для вызова метода с использованием отражения? - PullRequest
1 голос
/ 29 июля 2010

хорошо, вот сделка, я забираю все методы из веб-сервиса и предоставляю способ их протестировать. пока что мы показываем их методы, а некоторые из них имеют дело только с целыми числами и строками. об этой части заботятся. (мы можем правильно вызывать методы и анализировать результаты)

проблема в том, что некоторые из этих параметров, необходимых для вызова метода, являются классами, которые определены где-то в веб-сервисе, и у нас нет возможности узнать, что это такое. единственное, что мы знаем, это то, что эти классы состоят только из строк и целых чисел. (Яй)

позвольте мне сказать, что я ищу создание экземпляра типа «Агент» во время выполнения.

пока у меня есть доступ к службе, которая была загружена во время выполнения, которая находится в другом классе. это работает просто отлично

Класс прокси:

.
.
.
CompilerParameters parms = new CompilerParameters(assemblyReferences);      
CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
// Checks For Errors
// add the web service method to our list of methods to test
//--------------------------------the following variables are class level ---------------------------
object service = results.CompiledAssembly.CreateInstance(serviceName);
Type types = service.GetType();
List<ConstructorInfo> listConstructors = (service as Types).GetType().GetConstructors().ToList();
List<MethodInfo> listMethods = types.GetMethods().ToList();

listMethods.Where(mi => mi.GetCustomAttributes(false).
    Where(at => at.GetType() == typeof(SoapDocumentMethodAttribute)).
    Count() > 0).ToList().ForEach(methodsInfo =>{
           //methods to test is a list of a wrapper class for methodInfos
            MethodsToTest.Add(new MethodTest(methodsInfo));
        });

сейчас, в другом классе, я работаю в. Я пытаюсь получить объект нужного нам типа, вызвав метод:

Я пытаюсь создать экземпляр этого класса "Агент"

private void populateParameterListView(){
            if (funcLBox.SelectedItem != null)
            {
                resultTBlock.Text = String.Empty; //our textbox
                paramLView.Items.Clear();
                ParameterUserInput pui = null; //a wrapper class for parameterinfo
                Proxy.MethodsToTest[index].info.ToList().ForEach(param =>
                {
                pui = new ParameterUserInput(param);
                paramLView.Items.Add(pui);
                //this will check if it is a system type or a custom type
                if (!pui.ParameterType.IsSealed) 
                { 
                   // this is where we want to be. nevermind the code above this
                   //temp in this case is "Agent"
                   string temp = Proxy.MethodsToTest[index].info.GetValue(0).ToString().Split(' ')[0];

                   MemberInfo[] mia = Proxy.types.GetMember(temp);
                   //get an object of the type we need by invoking the method
                }
            });

    }

На данный момент он пытается найти членов через 'типы', объявленные в прокси, выполняя для него элемент get. проблема в том, что я уверен, что я все еще смотрю в неподходящее место для этих участников. Кто-нибудь может увидеть, что я делаю не так? я знаю, что это как-то связано с тем, что я на самом деле повторяю над

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

я взял результаты компиляции и попытался найти там тип. я сделал результаты компилятора переменной уровня класса, которую позже использовал повторно.

CompilerResults = provider1.CompileAssemblyFromDom(parms, unit1);

Затем я получил к нему доступ и взял тип класса, который искал

CompilerResults.CompiledAssembly.GetType(temp)

в данном случае temp - это имя пользовательского класса, который я искал в веб-сервисе

после того, как вы получите тип, вы можете получить информацию о конструкторах, свойствах и методах

0 голосов
/ 29 июля 2010

ОК, это может быть натяжкой, но Json для .Net библиотек ( json.codeplex.com ) позволит вам создавать объекты из любого класса.

Например (из ихдокументация)

Product product = new Product();

product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string output = JsonConvert.SerializeObject(product);

//{
//  "Name": "Apple",
//  "Expiry": "\/Date(1230375600000+1300)\/",
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output);

Это будет легко обрабатывать ваши целые и строчки.

Единственная проблема - получить JsonConvert.DeserializeObject<T>(), что вы легко можете сделать с помощью своих навыков отражения.

Редактировать: Вот необходимые навыки отражения.

object ParseUserInput(string jsonInput)
{
  Type type = <get type instance somehow>

  var json = typeof(JsonConvert);
  var generic = json.GetMethods().Where(m => 
       m.Name == "DeserializeObject" &&
       m.GetParemeters().Count == 1).Single();
  var method = generic.MakeGenericMethod(type);

  return method.Invoke(null, jsonInput);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...