Неуниверсальный тип в открытый универсальный типC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Неуниверсальный тип в открытый универсальный тип

Сообщение Anonymous »

Мне нужен способ сопоставить неуниверсальный тип с универсальным типом для десериализации с помощью IValueResolver или IMemberValueResolver
Я нашел эту документацию, которая пересылается на тесты github.
Проблема в том, что существуют только сопоставления открытого универсального типа с неуниверсальным типом с использованием IValueResolver или между открытым универсальным типом и открытый универсальный тип. Этот способ работает так, как ожидалось.
Что мне нужно сделать, так это сопоставить универсальный тип с неуниверсальным типом (это работает) и наоборот для десериализации.Мои типы:

Код: Выделить всё

public sealed class Foo
{
public T? Value { get; set; }
}

public sealed class SerializableFoo
{
public string? TypeAQN { get; set; }

public string? Data { get; set; }
}
Я пытался создать сопоставление:

Код: Выделить всё

// Working
this.CreateMap(typeof(Foo), typeof(SerializableFoo), MemberList.None)
.ForMember(nameof(SerializableFoo.TypeAQN), opt => opt.MapFrom(typeof(TypeAQNValueResolver)))
.ForMember(nameof(SerializableFoo.Data), opt => opt.MapFrom(typeof(DataValueResolver)));

// not working
this.CreateMap(typeof(SerializableFoo), typeof(Foo), MemberList.None)
.ForMember(nameof(Foo.Value), opt => opt.MapFrom(typeof(SerializableToFooValueResolver)));

private sealed class TypeAQNValueResolver : IValueResolver
{
public string? Resolve(Foo source, SerializableFoo destination, string? destMember, ResolutionContext context) =>
typeof(T).AssemblyQualifiedName;
}

private sealed class DataValueResolver : IValueResolver
{
/// 
public string? Resolve(Foo source, SerializableFoo destination, string? destMember, ResolutionContext context) =>
source.Value?.ToString() ?? "";
}
Я пытался создать IValueResolve, используя один, два, три и даже 4 дженерика, и каждый раз среда выполнения выдает мне это исключение:
Изображение

Код: Выделить всё

The number of generic arguments provided doesn't equal the arity of the generic type definition.
Parameter name: instantiation
Независимо от того, сколько универсальных параметров я добавляю.
Как происходит сопоставление неуниверсального типа с открытым универсальным типом с помощью IValueResolver работает?
ДЕМО dotnetfiddle
РЕДАКТИРОВАТЬ
Мне удалось поработайте над этой проблемой, представив интерфейс - но это кажется неправильным и работает только для очень конкретных известных обобщенных аргументов:

Код: Выделить всё

public interface IFoo
{
object? Value { get; set; }
}

public sealed class Foo : IFoo
{
public T? Value { get; set; }

object? IFoo.Value
{
get => this.Value;
set => this.Value = (T?)value;
}
}
Изменения в сопоставлении с:

Код: Выделить всё

this.CreateMap(typeof(SerializableFoo), typeof(IFoo), MemberList.None)
.IncludeAllDerived()
.ForMember(nameof(IFoo.Value), opt => opt.MapFrom(typeof(SerializableToFooValueResolver))); // Yes - generic CreateMap is now possible.
this.CreateMap(typeof(SerializableFoo), typeof(Foo), MemberList.None)
.IncludeBase(typeof(SerializableFoo), typeof(IFoo));

private sealed class SerializableToFooValueResolver : IValueResolver
{
/// 
public object? Resolve(SerializableFoo source, IFoo destination, object? destMember, ResolutionContext context)
{
var destinationType = destination.GetType();
if (destinationType.IsGenericType)
{
var genericArgType = destinationType.GetGenericArguments()[0];
if (genericArgType == typeof(double))
{
return double.Parse(source.Data ?? string.Empty);
}
}

return null;
}
}
Это работает, но это определенно не тот путь, по которому я хочу идти, потому что это требует обработки большого количества случаев во время выполнения и кажется неправильным.


Подробнее здесь: https://stackoverflow.com/questions/792 ... neric-type
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»