У меня есть обобщенный класс c, для которого я хочу несколько конструкторов. В одном из этих конструкторов я хочу передать параметр типа перегруженному конструктору. Это возможно?
Скажем, у меня есть это.
public class Collection<T>
{
public Collection(IEnumerable<T> collection, Func<T, T, int> distanceCalculation)
{
}
}
Это сработает. Теперь я могу создать экземпляр моего класса с чем-то вроде
var collection = new Collection<int>(new List<int>(), (a, b) => a - b);
Но теперь я хочу упростить использование класса Collection, поэтому я создал интерфейс, такой как IComparable, для определения logi для вычисления расстояния c в сам класс:
public interface IDistanceCalculable
{
int CalculateDistance(object other);
}
Я думал, что тогда смогу создать еще один конструктор для Collection, но он не компилируется:
public Collection(IEnumerable<IDistanceCalculable> collection) : this<IDistanceCalculable>(collection, (a, b) => a.CalculateDistance(b))
{
}
Или
public Collection(IEnumerable<T> collection) where T : IDistanceCalculable : this(collection, (a, b) => a.CalculateDistance(b))
{
}
Потому что я не могу дать аргумент типа базовому конструктору, который вызывается, или указать дополнительные ограничения для конструктора. Есть ли способ сделать что-то подобное?
Я обнаружил, что могу использовать метод stati c для достижения того же, но это выглядит как менее чистый код, чем новый конструктор
public static Collection<V> From<V>(IEnumerable<V> collection) where V : IDistanceCalculable
{
return new Collection<V>(collection, (a, b) => a.CalculateDistance(b));
}