Параметр типа для метода такой же, как его внешний тип

У меня есть такой интерфейс:

public interface IStuff
{
    bool DoSomethingWith<T>(T type);
}

И этот класс, который реализует это

    public class MyStuff<T> : IStuff
    {

        readonly ISomeClass<T> _cls;

        public MyStuff(ISystemCache cache)
        {
            _cls= cache.Get<T>();
        }

        public bool DoSomethingWith<T>(T type)
        {
            //dummy code here that returns a bool
            Type theType = typeof(T);
            return theType == typeof(T);
        }
     }

Теперь причина типа T находится в классе MyStuff, потому что я хочу, чтобы он был доступен в конструкторе класса, который реализует IStuff. MyStuff будет передан в некотором типе для работы в его методе DoSomethingWith.

Теперь DoSomethingWith также имеет тип T потому что я хочу, чтобы он был доступен на всех классах, которые реализуют IStuff.

IStuff будет иметь не более одной или двух реализаций; на данный момент только один, но как только я завершу дизайн, будет добавлен еще один. Но будет около 5-6 различных реализаций ISomeClass отправлено в MyStuff учебный класс. Я не хочу повторяться MyStuff для каждой реализации ISomeClass, Позже MyStuff_V2 будет делать что-то еще, будет реализация ISomeClass это будет отправлено в.

Как мне спроектировать это так, чтобы я не получал предупреждение компилятора "Параметр Type T имеет то же имя, что и параметр Type из внешнего класса MyStuff<T>?

РЕДАКТИРОВАТЬ Это очень надуманный пример, который может быть не идеальным, но цель состоит в том, чтобы иметь возможность создать универсальный тип для методов интерфейса, который также доступен для конструктора классов, реализующих этот интерфейс.

2 ответа

Вы хотите, чтобы два типа были разными? Просто измените тип:

public bool DoSomethingWith<T2>(T2 type)
{
   //dummy code here that returns a bool
   Type theType = typeof(T2);
   return theType == typeof(T);
}

В противном случае вам придется делать то, что предлагает @Marcin.

Более полный пример:

void Main()
{
   IStuff s = new MyStuff<int>();
   Console.WriteLine(s.DoSomethingWith(2.34)); // compare will be false (double != int)
   Console.WriteLine(s.DoSomethingWith(5)); // compare will be true (int == int)
}

// Define other methods and classes here
public interface IStuff
{
    bool DoSomethingWith<T2>(T2 type);
}

public class MyStuff<T> : IStuff
{
   public MyStuff()
   {
      // Do whatever with type T
   }

   public bool DoSomethingWith<T2>(T2 type)
   {
      // dummy code here that returns a bool
      Type theType = typeof(T2);
      return theType == typeof(T);
   }
}

Вы должны сделать IStuff общий:

public interface IStuff<T>
{
    bool DoSomethingWith(T type);
}

менять MyStuff<T> реализовать IStuff<T>:

public class MyStuff<T> : IStuff<T>

и с этим вы можете просто удалить общий параметр из DoSomething реализация:

public bool DoSomethingWith(T type)
{
    //dummy code here that returns a bool
    Type theType = typeof(T);
    return theType == typeof(T);
}
Другие вопросы по тегам