C # Reflection - Ошибка типа - PullRequest
       27

C # Reflection - Ошибка типа

0 голосов
/ 10 января 2012
string assembly = "Ektron.Cms.ObjectFactory.dll";
string asspath = path + "bin\\" + assembly;
Assembly run_obj = Assembly.LoadFrom(@asspath);
paraObj[0] = run_obj.GetType(
    "Ektron.Cms.Search.SearchContentProperty",
    true,
    true
).GetProperty("Language");

string equalExp = "Ektron.Cms.Search.Expressions.EqualsExpression";
Type objclass = run_obj.GetType(equalExp, true, true);       
object objObj = Activator.CreateInstance(objclass, paraObj);

Activator.CreateInstance(objclass, paraObj) выдает ошибку:

System.Reflection.RuntimeParameterInfo не может быть неявно преобразовано в Ektron.Cms.Search.Expresions.PropertyExpression

Ответы [ 2 ]

1 голос
/ 10 января 2012

Значение, хранящееся в paraObj[0], имеет тип RuntimeParameterInfo, тогда как конструктор для EqualsExpression ожидает объект типа PropertyExpression.Вы должны убедиться, что типы объектов в paraObj могут быть связаны с подходящим конструктором для Activator, чтобы иметь возможность создавать новый объект.

Для решения вашей проблемы вам нужно создать экземпляр PropertyExpression и используйте это как первый элемент в вашем массиве paraObj:

string assembly = "Ektron.Cms.ObjectFactory.dll";
string asspath = path + "bin\\" + assembly;
Assembly run_obj = Assembly.LoadFrom(@asspath);

PropertyInfo propertyInfo = run_obj.GetType("Ektron.Cms.Search.SearchContentProperty", true, true).GetProperty("Language");
PropertyExpression propertyExpression = new PropertyExpression(propertyInfo); // create the property expression here, I am unsure how to instantiate it.
paraObj[0] = propertyExpression;
paraObj[1] = longValue;

string equalExp = "Ektron.Cms.Search.Expressions.EqualsExpression";
Type objclass = run_obj.GetType(equalExp, true, true);       
object objObj = Activator.CreateInstance(objclass, paraObj);
0 голосов
/ 10 января 2012

Вы не указываете тип, который конструктор ожидает от вашего кода, ясно, что вы передаете PropertyInfo.

Если вам нужно значение из свойства, на которое указывает PropertyInfo, вам придется использовать PropertyInfo.GetValue

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

var propInfo  = run_obj.GetType(
                  "Ektron.Cms.Search.SearchContentProperty",
                   true,true).GetProperty("Language");

paraObj[0] = propInfo.GetValue(null,null)  //depending on the requirement
...