Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос Есть ли способ преобразовать объект к типу?
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."
"Чтобы разрешить эту ошибку, убедитесь, что операция, которую вы выполняете, действительна для типа, в котором вы выполняете операцию."
Вообще не ясно, что это предлагают сделать.
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой
Ответы на вопрос 3
@MonadTeq
1. Хотя бы вот так:

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


2. По CS0118 - Имеет смысл поразмышлять, почему в языке со строгой типизацией выдаётся такая ошибка, при том, что строчкой выше Вы сами пытветесь определить тип в Run-time, а в другой строчке ниже пишете default - для какого типа default? Может имеет смысл сначала понять основы С#/CLR?
Ответ написан
@mvv-rus
Настоящий админ AD и ненастоящий программист
Для задания динамического типа для поля в C# есть ключевое слово dynamic. Но на самом деле, это - object, просто для него компилятор автомтически реализует преобразование типов (и ещё кое-что - см. [документацию](https://learn.microsoft.com/en-us/dotnet/framework...) она хотя и по Framework, но многое из этого есть и в .NET(Core и современном))
Ответ написан
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Именно так нельзя. Но можно вот так, если очень надо: Есть ли способ преобразовать объект к типу?
В вашем же случае, если тип аргумента неизвестен, следует хранить аргумент в типе object и отдельно его тип. Либо реализовать поддержку типов всех возможных аргументов. А если еще подумать, то можно заменить большую часть вот этого кода обычным словарём.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы