Определите, происходит ли объект из типа набора

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

string pattern = "(?<!//.*);(?=[^;]*(//|$))";
Console.WriteLine(Regex.Replace("line 1 //comment", pattern, "#"));
Console.WriteLine(Regex.Replace("line2;", pattern, "#"));
Console.WriteLine(Regex.Replace("extra; text; //comment may also contain ;.", pattern, "#"));

Вывод:

line 1 //comment
line2#
extra; text# //comment may also contain ;.
20
задан GONeale 15 April 2009 в 04:18
поделиться

5 ответов

Это будет самая простая проверка ..

if(Obj is ICollection)
{
    //Derived from ICollection
}
else
{
    //Not Derived from ICollection
}
34
ответ дан 29 November 2019 в 22:38
поделиться

Чтобы получить фактический тип T во время выполнения, вы можете использовать выражение typeof (T). Оттуда обычные операторы сравнения типов сделают свое дело

bool isEnumerable = typeof(IEnumerable<int>).IsAssignableFrom(typeof(T));

Полный пример кода:

static bool Foo<T>()
{
  return typeof(IEnumerable<int>).IsAssignableFrom(typeof(T));
}

Foo<List<T>>();  // true
Foo<int>(); // false
8
ответ дан 29 November 2019 в 22:38
поделиться

Вы можете использовать Type.GetInterface () с искаженным именем.

private bool IsTAnEnumerable<T>(T x)
{
    return null != typeof(T).GetInterface("IEnumerable`1");
}
15
ответ дан 29 November 2019 в 22:38
поделиться

Я бы вместо этого протестировал IEnumerable , поскольку тип коллекции может реализовывать только IEnumerable , он не должен реализовывать IEnumerable .

Это также зависит: что вы имеете в виду с типом коллекции ? Вы можете иметь коллекцию, не реализуя ни один из этих интерфейсов.

3
ответ дан 29 November 2019 в 22:38
поделиться

Кроме того, помните только то, что вы используете дженерики, не забывайте другие базовые методы, в данном случае, такие как перегрузка , Я подозреваю, что вы планируете что-то вроде этого:

void SomeFunc<T>(T t)
{
    if (IsCollectionCase(t))
       DoSomethingForCollections()
    else
       DoSOmethingElse();
}

Это было бы гораздо лучше обработать как:

void SomeFunc(IEnumerable t)
{
       DoSomethingForCollections()
}
void SomeFunc<T>(T t)
{
       DoSomethingElse()
}
3
ответ дан 29 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

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