#c# #automapper
Вопрос:
Мне нужно сопоставить класс SurveySource с классом SurveyDestination, я получаю это сообщение об исключении
Исключение InvalidCastException: Невозможно привести объект типа «Система».Коллекции.Общий список`1[Лаборатория.ISourceEntity] Лаборатория «для ввода».Коллекция ISourceCollection».
https://github.com/abmptit/TestAutomapper
Мой исходный класс :
public interface ISourceCollection : IEnumerable<ISourceEntity>
{
string Name { get; set; }
int Count();
}
public interface ISourceEntity
{
string Name { get; set; }
string Value { get; set; }
}
public class SourceCollection : ISourceCollection
{
public string Name { get; set; }
public int Count()
{
return 0;
}
public IEnumerator<ISourceEntity> GetEnumerator()
{
return (IEnumerator<ISourceEntity>)this;
}
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)this;
}
}
public interface ISourceSurvey
{
ISourceCollection Collection { get; set; }
}
public class SourceSurvey : ISourceSurvey
{
public ISourceCollection Collection { get; set; }
}
Мой класс назначения :
public interface IDestinationCollection : IEnumerable<IDestinationEntity>
{
string Name { get; set; }
int Count();
}
public interface IDestinationEntity
{
string Name { get; set; }
string Value { get; set; }
}
public class DestinationCollection : IDestinationCollection
{
public string Name { get; set; }
public int Count()
{
return 0;
}
public IEnumerator<IDestinationEntity> GetEnumerator()
{
return (IEnumerator<IDestinationEntity>)this;
}
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)this;
}
}
public interface IDestinationSurvey
{
ISourceCollection Collection { get; set; }
}
public class DestinationSurvey : IDestinationSurvey
{
public ISourceCollection Collection { get; set; }
}
Моя основная программа для mapp source => dest
class Program
{
static void Main(string[] args)
{
var config = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<ISourceCollection, DestinationCollection>();
cfg.CreateMap<SourceSurvey, DestinationSurvey>()
.ForMember(m => m.Collection, act => act.MapFrom(src => src.Collection));
});
var mapper = config.CreateMapper();
dynamic dynamicSurvey = new ExpandoObject();
var sourceSurvey = mapper.Map<SourceSurvey>(dynamicSurvey);
var destinationSurvey = mapper.Map<DestinationSurvey>(sourceSurvey);
Console.ReadKey();
}
}
Комментарии:
1. Вы знаете, что ваша
IEnumerable
реализация вSourceCollection
не имеет никакого смысла ? Вы не можете привестиSourceCollection
кIEnumerator<ISourceEntity>
, так как он этого не реализует (и именно поэтому вы получаетеInvalidCastException
) … та же история сDestinationCollection
2. общедоступный класс DestinationSurvey : IDestinationSurvey { общедоступная коллекция IDestinationCollection { get; set; } }
3. Почему у него 1 ? Очевидно, что он должен написать правильную реализацию
IEnumerable<T>
(или производную от класса, который уже это делает) … Класс приведения, который не реализует данный интерфейс, очевидно, закончитсяInvalidCastException
— это очевидно4. Мне нужно сопоставить SourceSurvey => DestinationSurvey
5. когда мы заменяем в DestinationSurvey/ IDestinationSurvey, IDestinationCollection на IEnumerable<ISourceEntity>, это работает, но нам абсолютно необходимо использовать IDestinationCollection.