Тестирование IsAssignableFrom, IsInstanceOf и BaseType - PullRequest
4 голосов
/ 22 февраля 2010

Это просто шаблон типа службы поиска, который я пытаюсь реализовать, где я хотел бы поймать попытку зарегистрировать реализацию на интерфейсе, которому он не принадлежит, как в:

public void Add(Type interfaceType, object implementingObject)
{
    // ... check for nulls            

    // NO GOOD
    if(!implementingObject.GetType().IsAssignableFrom(interfaceType)...

    // NO GOOD
    if(!implementingObject.GetType().IsInstanceOf(interfaceType)...

    // FINALLY!
    if(!implementingObject.GetType().BaseType.IsAssignableFrom(interfaceType)...

    // ... ok, add it           
}

Теперь я наконец-то решил использовать BaseType.IsInstanceOf, заглянув в утверждение NInitance isInstanceOf, но оно все еще кажется нереальным.

Может кто-нибудь объяснить, почему это имеет смысл? Есть ли какой-нибудь более простой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2010

Это можно посмотреть слева направо, как обычно, когда вы делаете назначение на языке.

Так что в C # эквивалент вызова assigningTo.IsAssignableFrom(assigningFrom) (или любого другогометоды, о которых вы упомянули) - это «будет работать следующий код»:

<assigningTo type> variable = <instance of assigningFrom>;

Применяя это к своему коду, вы хотите использовать:

interfaceType.IsAssignableFrom(implementingObject.GetType())
interfaceType.IsAssignableFrom(implementingObject.GetType().BaseType)

Логикавы хотите узнать, можно ли назначить какой-либо тип объекта реализации объекту типа интерфейса или, другими словами, объекту реализации можно присвоить interfaceType.

0 голосов
/ 22 февраля 2010

Я думаю, что вы хотите:

interfaceType.IsAssignableFrom(implementingObject.GetType())

Почему конкретный тип может быть назначен через интерфейс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...