Бір-бірімен салыстыруға болатын реттелетін түрлер жиынтығы

Әр түрлі мәндерді білдіретін интерфейстің жоғарғы жағында салынған нысандардың жиынтығын құрғым келеді:

integers
strings
datetime

Және бұл нысандар келесі әрекеттерді орындай алады:

IData intValue = new IntData();
IData intValue2 = new IntData();

bool result = intValue.EqualsTo(intValue2);

IData dateTimeData = new DateTimeData();
IData dateTimeData2 = new DateTimeData();

bool result = dateTimeData.GreaterThan(dateTimeData2);

Сондықтан маған интерфейс қажет, бірақ қалай салыстыру мүмкіндігін орнатуға болады? Түрі IEnumerable болып табыла ма?

public interface IData
{

}
2
Егер бетонның негізгі түрлері әр түрлі болса, не болады? Басқаша айтқанда, intValue.GreaterThan (dateTimeData2) жолына не болады?
қосылды автор dlev, көзі

1 жауаптар

Менің ойымша сіз негізінен C# нұсқасын нұсқа түрінің іздейміз. C# dynamic s туралы ойлайтын ең жақын нәрсе:

  public class DynamicComparer : IComparer
  {//...

Өкінішке орай, бұл заңсыз болар еді

  public class DynamicComparer : IComparer
  {

және өзіңіз қалаған логиканы іске асырыңыз.

Бейнелеу:

Мен үшін тағы бір тәсіл болды, ол біріктіретін сыныпты жасырын жинақтармен қамтамасыз ету болып табылады - иә Мен бұны ұсынбаймын, бірақ мен бастапқы сұраққа жауап берудің ең шығармашылық жолдарын ойластыруды ұнатамын :

public class MyData : IData, IComparable
{
    public static implicit operator MyData(string s)    { /* ... */ }
    public static implicit operator MyData(DateTime dt) { /* ... */ }
    public static implicit operator MyData(int dt)      { /* ... */ }

   //implement IComparable members...

   //e.g.:
    private dynamic variant_data;//or, the desired default representation
                                 //for comparisons, e.g. string?
}

Update Here is a semi-fullblown example of how you could abuse implicit conversions to just about achieve what you want (almost transparent comparison of disjunct types): https://ideone.com/WwI87

using System;
using System.Collections.Generic;

public class Program
{
    public class MyData : IEquatable, IComparable
    {
        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 members...
       //implement IEquatable members...

       //override object.Equals()
       //override object.GetHashCode()
        public static bool operator <(MyData a, MyData b) { return Comparer.Default.Compare(a,b) == -1; }
        public static bool operator >(MyData a, MyData b) { return Comparer.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.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");
    }
}
0
қосылды
қосымша миға толы болды; Мен жан-жақты түрлендірулерді либералды пайдалануды ұсынбаймын, бірақ бәрібір: бәрі мүмкін. ideone.com/WwI87 сайтында толық жаңартылған мысалды қараңыз
қосылды автор sehe, көзі