Я думаю, что вы в основном ищете версию C # варианта типа . Самая близкая вещь, о которой я могу думать прямо сейчас, - это C # dynamic
s:
public class DynamicComparer : IComparer<dynamic>
{ // ...
К сожалению, это было бы незаконно, поэтому вы можете прибегнуть к
public class DynamicComparer : IComparer<object>
{
и реализуйте в нем логику, которую вы хотели.
Гениальная:
Другой подход, который только что пришел мне в голову, состоит в том, чтобы предоставить объединяющемуся классу неявные перемены - да Я не рекомендую этого - но я люблю думать о самых творческих способах ответа на первоначальный вопрос
public class MyData : IData, IComparable<MyData>
{
public static implicit operator MyData(string s) { /* ... */ }
public static implicit operator MyData(DateTime dt) { /* ... */ }
public static implicit operator MyData(int dt) { /* ... */ }
// implement IComparable<MyData> members...
// e.g.:
private dynamic variant_data; // or, the desired default representation
// for comparisons, e.g. string?
}
Обновление Ниже приведен пример того, как вы могли злоупотреблять неявными преобразованиями практически для достижения желаемого (почти прозрачное сравнение несвязанных типов): https://ideone.com/WwI87
using System;
using System.Collections.Generic;
public class Program
{
public class MyData : IEquatable<MyData>, IComparable<MyData>
{
public static implicit operator MyData(string s) { var data = new MyData(); /* TODO */ return data; }
public static implicit operator MyData(DateTime dt) { var data = new MyData(); /* TODO */ return data; }
public static implicit operator MyData(int dt) { var data = new MyData(); /* TODO */ return data; }
// implement IComparable<MyData> members...
// implement IEquatable<MyData> members...
// override object.Equals()
// override object.GetHashCode()
public static bool operator <(MyData a, MyData b) { return Comparer<MyData>.Default.Compare(a,b) == -1; }
public static bool operator >(MyData a, MyData b) { return Comparer<MyData>.Default.Compare(a,b) == +1; }
// e.g.:
// the desired default representation for comparisons, e.g. string?
// use 'dynamic' on C# 4.0 and beyond
private object/*dynamic*/ variant_data;
public int CompareTo(MyData other)
{
// TODO implement your own logic
return GetHashCode().CompareTo(null != other ? other.GetHashCode() : 0);
}
// TODO implement your own equality logic:
public bool Equals(MyData other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.variant_data, variant_data);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (MyData)) return false;
return Equals((MyData) obj);
}
public override int GetHashCode() { return (variant_data != null ? variant_data.GetHashCode() : 0); }
public static bool operator ==(MyData left, MyData right) { return Equals(left, right); }
public static bool operator !=(MyData left, MyData right) { return !Equals(left, right); }
}
public static void Main(string[] args)
{
var cmp = Comparer<MyData>.Default;
string s = "123";
int i = 234;
DateTime dt = DateTime.Now;
if (-1 == cmp.Compare(s, i)) Console.WriteLine("s < i");
if (+1 == cmp.Compare(dt, i)) Console.WriteLine("dt > i");
// or even:
if ((MyData) s > i) Console.WriteLine("s > i");
if ((MyData) dt< i) Console.WriteLine("dt < i");
}
}