Как я узнаю, является ли тип объекта подклассом IEnumerable <T> для какого-либо типа T значения?

Вот 3 возможности, которые используют Algebraic Data Types (ADT).

Сначала object-oriented:

sealed trait LinkedListNode[A] {
  def calleachnode(inputfunction : A => Unit): Unit 
}

case class BranchNode[A](value:A, next: LinkedListNode[A]) extends LinkedListNode[A] {
  def calleachnode(inputfunction : A => Unit): Unit = {
    inputfunction(value)
    next.calleachnode(inputfunction)
  }
}

case class LeafNode[A](value:A) extends LinkedListNode[A] {
  def calleachnode(inputfunction : A => Unit): Unit = {
    inputfunction(value)
  }
}

Или, если вы предпочитаете, вы можете использовать сопоставление с образцом:

sealed trait LinkedListNode[A] {

  def calleachnode(inputfunction : A => Unit): Unit = this match {
    case BranchNode(value, next) => 
        inputfunction(value)
        next.calleachnode(inputfunction)
    case LeafNode(value) =>
        inputfunction(value)
  }
}

case class BranchNode[A](value:A, next: LinkedListNode[A]) extends LinkedListNode[A]

case class LeafNode[A](value:A) extends LinkedListNode[A]

Вы можете проверить эти решения с помощью:

[112 ]

Теперь более functional способ использовать ADT:

sealed trait LinkedListNode[A] 

case class BranchNode[A](value:A, next: LinkedListNode[A]) extends LinkedListNode[A]

case class LeafNode[A](value:A) extends LinkedListNode[A]


def calleachnode[A](listNode: LinkedListNode[A], inputfunction : A => Unit): Unit = listNode match {
  case BranchNode(value, next) => 
    inputfunction(value)
    calleachnode(next, inputfunction)
  case LeafNode(value) =>
    inputfunction(value)
} 

Тест выглядит немного иначе:

val lln = BranchNode(12, LeafNode(2))
calleachnode[Int](lln, (i) => println(i * 2)) 
9
задан Simon 13 March 2009 в 09:03
поделиться

2 ответа

(редактирование - увеличило стоимость биты типа),

Необходимо проверить все интерфейсы, которые это реализует (обратите внимание, что это могло в реализации теории IEnumerable<T> для нескольких T):

foreach (Type interfaceType in obj.GetType().GetInterfaces())
{
    if (interfaceType.IsGenericType
        && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0];
        if(!itemType.IsValueType) continue;
        Console.WriteLine("IEnumerable-of-" + itemType.FullName);
    }
}
12
ответ дан 4 December 2019 в 19:36
поделиться

Можно ли сделать что-то с GetGenericArguments ?

0
ответ дан 4 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: