c# как обработать два аргуза неопределенного типа? - PullRequest
0 голосов
/ 14 января 2020

Что я хочу: функция для записи изменений после модификации

В моем приложении люди могут изменять данные, и я хочу записать, какие данные изменены

Что я пробовал: Generi c

Я использую ABP, и мне нужно сравнить сущность (старые данные) и InputDto (новые данные), поэтому я написал функцию преобразовать сущность или dto в словарь, а затем я сравниваю различия между двумя словарями, чтобы получить изменения.

Это моя функция преобразования:

public static Dictionary<string, string> ConverModelToDict<T>(T model)
{
    Type t = model.GetType();
    PropertyInfo[] propertyList = t.GetProperties();

    Dictionary<string, string> result = new Dictionary<string, string>();

    foreach (PropertyInfo item in propertyList)
    {
        string name = item.Name;

        if (item.GetValue(model) != null)
        {
            object value = item.GetValue(model);
            result.Add(name, value.ToString());
        }
    }

    return result;
}

Я написал другой функция для получения объекта и dto для сравнения:

public async Task<string> CompareEntityAndDto<T, K>(T oldModel, K newModel, string moduleName)
    {
        var oldDict = ConverModelToDict(oldModel);
        var newDict = ConverModelToDict(newModel);

        string result = "";

        foreach (var key in newDict.Keys)
        {
            if (oldDict.ContainsKey(key) && newDict[key] != oldDict[key])
            {
                var value = "【" + oldDict[key] + "】" + "changeTo" + "【" + newDict[key] + "】";
                result += key + ":" + value + ";";
            }
        }

        string detial = moduleName + result;
        return detial;
    }

oldModel - это объект, который является результатом запроса к базе данных, newmodel - это dto из данных формы, moduleName - это просто строка, вот как я вызываю функцию в моем приложении

await _compareAppService.CompareEntityAndDto(query, input, "somestring");

и получаю ошибку:

System.NotImplementedException: IsValid (значение объекта) не было реализовано этот класс. Предпочтительной точкой входа является GetValidationResult (), и классы должны переопределять IsValid (значение объекта. Контекст ValidationContext). в System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid (значение объекта. ValidationContext validationContext) в System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult (объектное значение. в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation \ Interception \ DataAnnotationsValidator.cs: строка 38 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.SetValidationErrors (Объект validatingObject \ spject \ spject \ sbject) в: Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 208 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.ValidateObjectRecursively (объект validatingObject. Int32 currentDepth) в D: \ Github \ Interception \ Interp \ Intertime \ aspnet \ MethodInvocationValidator.cs: строка 168 в Abp.Runtime.Validation.Interception.MethodInvocation Validator.ValidateObjectRecursively (Объект validatingObject. Int32 currentDepth) в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 188 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.Validate () в D \ sp \ Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 82 в Abp.Runtime.Validation.Interception.ValidationInterceptor.Intercept (вызов IInvocation) в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation Validation 30 : строка 178 в lambda_method (Closure. Object) в Microsoft.AspNetCore. Mvc .Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute (преобразователь IActionResultTypeMapper. ObjectMethodExecutor executor. Объектный контроллер. Объект [103]. аргументы в. Object. 4 * .Internal.ControllerActionInvoker.InvokeActionMethodAsyn c () в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.InvokeNextActionFilterAsyn c () в контекстном действии Microsoft.AspNetCore. * 1038 в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.Next (State & next. Область применения Объект и состояние. Boolean & isCompleted) в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.InvokeInnerFilterAsyn c () в Microsoft.AspNetCore. Mvc .Internal.ResourceInvoker.InvokeNextExceptionFilterAsyn

(1030 *) (1030 *) Как я могу исправить эту ошибку, или есть другой способ решить мою проблему?

...