Как я говорю, реализует ли Тип IList <>?

  1. Создайте файл .rspec в корне вашего проекта
  2. Добавьте путь к вашей спецификации, например

    --default-path test/spec/

  3. Добавьте шаблон имен файлов, например,

    --pattern ****/*.spec

  4. Запустите rspec, и он должен выбрать все ваши спецификации и запустить их:)
  5. default-path и pattern просто команды строковые аргументы, что означает, что вы также можете добавить любой другой аргумент командной строки, который принимает rspec (можно запустить rspec --help, чтобы увидеть доступные опции)

    Согласно https://www.relishapp.com/ rspec / rspec-core / v / 2-0 / docs / configuration / read-command-line-configuration-options-from-files вы также можете поместить параметры в ~/.rspec, что сделает их доступными глобально. , Локальные параметры файла .rspec переопределяют глобальные параметры.

16
задан Joe White 4 June 2009 в 16:12
поделиться

6 ответов

Фактически у вас не может быть экземпляра определения универсального типа. Следовательно, метод IsAssignableFrom () работает должным образом. Чтобы добиться желаемого, сделайте следующее:

public bool IsGenericList(Type type)
{
    if (type == null) {
        throw new ArgumentNullException("type");
    }
    foreach (Type @interface in type.GetInterfaces()) {
        if (@interface.IsGenericType) {
            if (@interface.GetGenericTypeDefinition() == typeof(ICollection<>)) {
                // if needed, you can also return the type used as generic argument
                return true;
            }
        }
    }
    return false;
}

Просто из любопытства, для чего вам это нужно?

26
ответ дан 30 November 2019 в 16:09
поделиться

У Люсеро и Рида Копси есть правильное решение. Чтобы сделать его более кратким, вот он в форме LINQified:

var isGenericList = type.GetInterfaces().Any(t => t.IsGenericType && 
    t.GetGenericTypeDefinition() == typeof(IList<>));
2
ответ дан 30 November 2019 в 16:09
поделиться

Используя это: http://msdn.microsoft.com/en-us/library/system.type.findinterfaces.aspx

Я пробовал это:

 public class Test : IList<string>
 {
//implementation left out...
 }

class Program
    {
        static void Main(string[] args)
        {
            Test t = new Test();
            TypeFilter myFilter = new TypeFilter(MyInterfaceFilter);

            Type type = t.GetType();
            Type[] x = type.FindInterfaces(myFilter, "System.Collections.Generic.IList");
            Console.WriteLine(x.Length);

        }

        public static bool MyInterfaceFilter(Type typeObj, Object criteriaObj)
        {
            if (typeObj.ToString().Contains(criteriaObj.ToString()))
                return true;
            else
                return false;
        }
    }
2
ответ дан 30 November 2019 в 16:09
поделиться

Тест пройден ...

public static bool IsGenericList( Type type )
{
  return type.Name == "IList`1" || type.GetInterface( "IList`1" ) != null;
}
1
ответ дан 30 November 2019 в 16:09
поделиться

Вы пробовали вызвать Type.GetInterface () ? Это не совсем понятно из справки, но я думаю, что он будет искать интерфейсы, реализованные базовыми типами, помимо самого типа. Если нет, вы всегда можете пройти через Type.BaseType и снова вызвать GetInterface () .

0
ответ дан 30 November 2019 в 16:09
поделиться

Используйте оператор « is »:

Оператор is используется для проверки является ли тип времени выполнения объекта совместим с заданным типом.

-3
ответ дан 30 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

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