Сериализация только тех свойств интерфейса, которые существуют в интерфейсе - PullRequest
0 голосов
/ 07 января 2020

Поэтому я пытаюсь сериализовать только те свойства интерфейса, которые существуют в интерфейсе, а не сам базовый тип.

С этой целью, следуя this , я ' Мы написали следующий код:

public static IEnumerable<T> ToInterfacedObjects<T>(this IEnumerable<T> data) where T : class
{
    var list = new List<T>();
    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (var datum in data)
    {
        var moq = new Mock<T>();
        foreach (var propertyInfo in properties)
        {
            var expressionParameter = Expression.Parameter(typeof(T));
            var expressionProperty = Expression.Property(expressionParameter, propertyInfo);
            var expressionConversion = Expression.Convert(expressionProperty, typeof(object));
            var expressionLambda =
                Expression.Lambda<Func<T, object>>(expressionConversion, expressionParameter);

            moq.SetupGet(expressionLambda).Returns(datum);
        }
        list.Add(moq.Object);
    }

    return list;
}

Проблема в том, что я получаю

System.ArgumentException: 'Выражение не является доступом к свойству: => (объект). ReportName '

On line moq.SetupGet(expressionLambda).Returns(datum);.

ReportName является одним из свойств в IReport. Я пытаюсь сериализовать IEnumerable<IReport>, который под капотом содержит List<Report>, но я не хочу, чтобы все в Report было сериализовано.

public interface IReport
{
    string ReportName { get; }
    string ReportSubject { get; }
    string ReportType { get; }
    string FilesUrl { get; }
    ReportStatus Status { get; }
    decimal LastRunDate { get; }
    decimal LastRunTime { get; }
    string UserCreated { get; }
    decimal DateCreated { get; }
    string UserUpdated { get; }
    decimal DateUpdated { get; }
    string DistListAdmin { get; }
    decimal DistListUpdateDate { get; }
    string DistListUpdateUser { get; }
}

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...