интерфейс <T>методов из реализующих классов без ссылки - PullRequest
0 голосов
/ 13 ноября 2011

У меня универсальный интерфейс, и несколько классов его реализуют.затем из глобального места я хочу использовать методы из этого интерфейса, но я не знаю их скомпилированный универсальный тип, поэтому ссылка - это только класс их объекта, как показано во время выполнения.(поэтому я не могу получить доступ к методам интерфейса)

несколько вопросов:

  1. Можно ли их использовать?
  2. я должен разработать его безОбобщение?
  3. Какова цель универсальных интерфейсов, если я не могу использовать их во время выполнения?
  4. Может ли обобщение / вход или динамическая помощь в этой ситуации?1014 * edit: пример кода
      public interface IMyInterface<T> 
            where T: class, new()
        {
            void Delete (T obj);
        }
    
    public class trigger {}
    public class triggervm : IMyInterface<trigger>
    {
    
    List<trigger> _trigList = new List<trigger>()
        public void Delete (trigger obj)
        {
            _trigList.Remove (obj);
        }
    }
    

    теперь, скажем, я хочу проверить, а затем использовать метод Delete из "глобального" места:

    if (chosenItem is IMyInterface<???>)
    {
         var item = chosenItem as      IMyInterface<???>;
         item.Delete(someObj);
    }
    

Ответы [ 4 ]

1 голос
/ 16 ноября 2011

, как предложил Томас, я использую динамический

и, как предложил "RedHat", у меня есть включающий класс, наследуемый как от моего интерфейса (IClipboard<T>), так и от родительского интерфейса (IClippable), которыйпросто «группирующий» интерфейс.

myinterface наследуется от интерфейса группировки, поэтому любой класс, реализующий myinterface, также совпадает с классом группировки.так что я могу проверить, является ли выбранный элемент IClippable.

самое чистое, что я мог бы получить с моими текущими знаниями языка.

лучше было бы поддерживать C #.

1 голос
/ 13 ноября 2011

Да, использование динамического может быть самым простым и лучшим способом справиться с этой проблемой. C # в действии Джона Скита упоминает об этом также в разделе о динамике.

Как говорили другие, больше кода меньше английского, и мы все можем сузить это здесь.

1 голос
/ 13 ноября 2011

Вот пример того, как вы можете использовать функции универсального интерфейса, не зная, что такое универсальные типы при написании кода.

Основная идея состоит в том, чтобы вызвать свою собственную универсальную функцию (в этомcase CompareValuesInternal) и использовать отражение для извлечения информации соответствующего типа для передачи вместе с вызовом.

 sm_compare_values_info = typeof(YourType).GetMethod("CompareValuesInternal", BindingFlags.NonPublic | BindingFlags.Static);

static public bool CompareValues(object x, object y)
{
  bool result = true;

  if ((x == null && y != null) || (x != null && y == null))
  {
    result = false;
  }
  else if (x == null && y == null)
  {
    result = true;
  }
  else if (x is IComparer)
  {
    result = ((x as IComparer).Compare(x, y) == 0);
  }
  else if (x is IComparable)
  {
    result = ((x as IComparable).CompareTo(y) == 0);
  }
  else if (x is IEqualityComparer)
  {
    result = (x as IEqualityComparer).Equals(x, y);
  }
  else if (x.GetType() != y.GetType())
  {
    result = false;
  }
  else
  {
    //----IMPORTANT PART----
    MethodInfo info = sm_compare_values_info.MakeGenericMethod(x.GetType());
    result = (bool)info.Invoke(null, new object[] { x, y });
  }

  return result;
}

static protected bool CompareValuesInternal<T>(T x, T y)
{
  bool result = false;

  if (x is IEqualityComparer<T>)
  {
    result = (x as IEqualityComparer<T>).Equals(x, y);
  }
  else if (x is IEquatable<T>)
  {
    result = (x as IEquatable<T>).Equals(y);
  }
  else if (x is IComparable<T>)
  {
    result = ((x as IComparable<T>).CompareTo(y) == 0);
  }
  else if (x is IComparer<T>)
  {
    result = ((x as IComparer<T>).Compare(x, y) == 0);
  }

  return result;
}
0 голосов
/ 14 ноября 2011
interface IInterface<T>
{
    Type GetMyType();
}
class MyClass1 : IInterface<int>
{
    public Type GetMyType()
    {
        return typeof(int);//each subclass must be return own generic type
    }
}

static void Main()
{
    new MyClass1().GetMyType()==typeof(int);//Is True
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...