Создайте класс Generi c, не зная типа - PullRequest
0 голосов
/ 06 апреля 2020

Я хотел бы создать обобщенный c класс с параметрами generi c, не зная типа.

List<T> genericList = new List<T>();

public void AddGenericValue<T>(T t1, T t2)
{
    for (int i = 0; i < genericList.Count; i++)
    {
        if (genericList[i].t1 == t1)
        {
            genericList[i].t2 = t2;
            return;

        }
    }

    genericList.Add(new GenericClass(t1, t2));
}

public class GenericClass<T>
{
    T t1;
    T t2;

    public GenericClass(T t1, T t2)
    {
        this.t1 = t1;
        this.t2 = t2;
    }
}

Теперь я получаю сообщение об ошибке При использовании обобщенного c типа 'GenericClass' требуется 1 тип аргумента.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

При указании типа необходимо указать параметры c generi:

new GenericClass<T>(t1, t2)

Причина этого в том, что параметры типа не могут быть выведены для классов, только для методов. Вы можете использовать это, написав фабрику:

static class GenericClassFactory
{
  public static GenericClass<T> Create(T t1, T t2)
  {
    return new GenericClass<T>(t1, t2);
  }
}

Теперь вы можете:

var foo = GenericClassFactory.Create(1, 2);

И T будет выведено компилятором.

Кроме того, список должен иметь правильный тип:

var genericList = new List<GenericClass<T>>();

Если вам нужно сохранить список как переменную-член, вам нужно будет продвигать тип generi c на уровень класса, а не уровень метода:

class Foo<T>
{
    private readonly List<GenericClass<T>> genericList = new List<GenericClass<T>>();

    public void AddGenericValue(T t1, T t2)
    {
        for (int i = 0; i < genericList.Count; i++)
        {
            if (genericList[i].t1 == t1)
            {
                genericList[i].t2 = t2;
                return;

            }
        }

        genericList.Add(new GenericClass<T>(t1, t2));
    }
}
1 голос
/ 06 апреля 2020

Это может решить вашу проблему:

List<GenericClass<T>> genericList = new List<GenericClass<T>>();
genericList.Add(new GenericClass<T>(t1, t2));

0 голосов
/ 06 апреля 2020

Здесь нужно две вещи,

  1. Ваш экземпляр класса должен ожидать универсальный c параметр, т.е. <T>, поэтому создайте экземпляр GenericClass, например

      new GenericClass<T>(t1, t2)
    
  2. Чтобы избежать ошибки времени компиляции, правильно определите свой список

      List<GenericClass<T>> genericList = new List<GenericClass<T>>();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...