Параметр типа для метода такой же, как его внешний тип
У меня есть такой интерфейс:
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);
}