2016-04-26 8 views
2

Я ошибочно разместил этот вопрос уже на части SharePoint.GetValue of PropertieInfo throws TargetParameterCountException (System.Reflection)

Мне нужно сопоставить одну модель с другой. Все работает хорошо, но последнее свойство генерирует исключение TargetParameterCountException. Свойство, которое генерирует исключение, называется «Item», это свойство не определено мной, я предполагаю, что это свойство из словаря.

Я уже пытался использовать все пять параметров вместо одного (как описано здесь Moq + Unit Testing - System.Reflection.TargetParameterCountException: Parameter count mismatch), но, к сожалению, я получу то же исключение. Я был бы очень признателен, если бы кто-то мог мне помочь.

KINDE С уважением и спасибо

Сандро

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

public class DataModel : Dictionary<string, object> {} 
public class DiscussionDataModel : DataModel 
{ 
    public DiscussionDataModel(Dictionary dictionary) : base(dictionary){} 

    public FieldUserValue Author 
    { 
    get { return (FieldUserValue) this["Author"]; } 
    set { this["Author"] = value; } 
    } 

    public double AverageRating 
    { 
    get { return (double) this["AverageRating"]; } 
    set { this["AverageRating"] = value; } 
    } 
} 

И это отрывок целевой модели, все другие свойства реализованы точно так же:

public class DiscussionModel : BaseModel 
{ 
    public FieldUserValue Author { get; set; } 
    public double AverageRating { get; set; } 
} 

И это общий метод расширения для отображения DataModel на BaseModel:

public static T ToModel(this DataModel dataModel) where T : BaseModel 
{ 
    try 
    { 
    T model = Activator.CreateInstance(); 
    if (dataModel != null) 
    { 
     PropertyInfo[] propertyInfos = dataModel.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); 

     foreach (PropertyInfo propertyInfo in propertyInfos) 
     { 
     object value = propertyInfo.GetValue(dataModel); 
     if (value == null) { break; } 
     PropertyInfo modelPropertyInfo = model.GetType().GetProperty(propertyInfo.Name); 
     modelPropertyInfo?.SetValue(model, value); 
     } 
     return model; 
    } 
    } 
    catch (Exception ex) 
    { 
    throw; 
    } 
    return null; 
} 

ответ

3

Проблема заключается в том, что свойство Item индексируется, то есть он имеет параметр. C# обычно не позволяет этого, но другие языки .NET, такие как VB.NET. Таким образом, это понятие известно CLR и, следовательно, также Reflection. В C# существует только один способ создания индексированного свойства, а именно через индексатор. То, что это делает на уровне CLR, - это создать индексированное свойство, называемое Item, так что вы могли бы просто наткнуться на индексатор.

Таким образом, решение должно проверить информацию о свойствах, имеет ли она параметры и продолжить цикл for, если это так. У вас нет возможности узнать, какие объекты перейдут в индексированное свойство.