Утиную типизацию можно эмулировать с помощью отражения - если тип поддерживает операцию (т. Е. Имеет определенный метод, который вы ищете), то он неявно относится к этому интерфейсу (даже если вы никогда этого не делали), и выдолжен это назвать.В противном случае это не так!
Проблема в том, что отражение C # немного медленное, и в большинстве случаев это будет тратить ваше время.Ниже приведен пример кода:
public static object To(this string value, Type t) {
object obj;
// This is evil, I know, but is the most useful way to extend this method
// without having an interface.
try {
MethodInfo method = t.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public,
null, new Type[] { typeof(string) }, null);
Preconditions.Check(method.ReturnType == t, "The return type doesn't match!");
obj = method.Invoke(null, new object[]{value});
} catch (Exception e) {
throw new CoercionException("I can't coerce " + value + " into a " + t.Name + "!", e);
}
return obj;
}
Для тех из вас, кто любит статистику, когда требуется отражение, поиск метода близок к нулю.Однако вызов метода:
obj = method.Invoke(null, new object[]{value});
Это скачок производительности, выполнение которого занимает около 4-5 мс.