Универсальные типы должны быть известны во время компиляции, поэтому вы не можете создать динамический делегат.Если вы указываете тип данных, вы можете создать словарь делегатов:
Dictionary<string, Func<int, int, bool>> comparisons;
comparisons.add("<", (x, y) => x < y);
comparisons.add("==", (x, y) => x == y);
comparisons.add(">", (x, y) => x > y);
. Вы можете использовать интерфейс IComparable
, чтобы разрешить разные типы, но тогда вы можете использовать только метод CompareTo
, чтобыреализовать операторы:
Dictionary<string, Func<IComparable, IComparable, bool>> comparisons;
comparisons.add("<", (x, y) => x.CompareTo(y) < 0);
comparisons.add("==", (x, y) => x.CompareTo(y) == 0);
comparisons.add(">", (x, y) => x.CompareTo(y) > 0);
Это, конечно, дает меньше ограничений для используемых данных, например, вы можете передать значение string
и DateTime
делегату оператора, и оно компилируется простохорошо.Это не до тех пор, пока вы не запустите его, он не сможет.