Задать вопрос
YaKotikTvoy
@YaKotikTvoy
Стьюдик

Как в C# в динамике задать у обощенного класса тип поля хранимого значения?

Есть класс Parameters
public class Parameters
{
    private readonly IArgument[] _arguments;
    private readonly (string Key, Type Type)[] _keyType;
    public Parameters(params (string, Type)[] keyType)
    {
        _keyType = keyType;
        _arguments = new IArgument[keyType.Length];
        
        for(int i = 0; i < _arguments.Length; i++)
        {
            Type type = _keyType[i].Type;//Вот здесь тип извлекается, и им нужно  типизировать обощенный класс Argument
            _arguments[i] = new Argument<type>(default);//CS0118
        }
    }
    public IArgument this [string key]
    {
        get
        {
            for(int i = 0;i < _keyType.Length;i++)
                if(_keyType[i].Key == key)
                    return _arguments[i];
            throw new ArgumentException("");
        }
        set
        {
            for(int i = 0;i < _keyType.Length;i++)
                if(_keyType[i].Key == key)
                    _arguments[i] = value;
            throw new ArgumentException("");
        }
    }
}

Есть класс Argument обобщенный.
public record struct Argument<T> : IArgument
{
    object IArgument.Value { get; set; }
    public T Value 
    {
        get => Value;
        set => Value = value;
    }
    public Argument(T value) => Value = value;
}

public interface IArgument
{
    object Value { get; set; }
}

Надо задать у него тип налету, как это сделать?

for(int i = 0; i < _arguments.Length; i++)
{
      Type type = _keyType[i].Type;//Вот здесь тип извлекается, и им нужно  типизировать обощенный класс Argument
      arguments[i] = new Argument<type>(default);//CS0118
}


В CS0118 ->
"To resolve this error, make sure that the operation you are performing is valid for the type you are performing the operation on."
"Чтобы разрешить эту ошибку, убедитесь, что операция, которую вы выполняете, действительна для типа, в котором вы выполняете операцию."
Вообще не ясно, что это предлагают сделать.
  • Вопрос задан
  • 30 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Именно так нельзя. Но можно вот так, если очень надо: Есть ли способ преобразовать объект к типу?
В вашем же случае, если тип аргумента неизвестен, следует хранить аргумент в типе object и отдельно его тип. Либо реализовать поддержку типов всех возможных аргументов. А если еще подумать, то можно заменить большую часть вот этого кода обычным словарём.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы