Вы не написали, что вы хотите сделать с персонажем, поэтому я дам вам решение, которое заменяет персонажа:
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 ;.
Это будет самая простая проверка ..
if(Obj is ICollection)
{
//Derived from ICollection
}
else
{
//Not Derived from ICollection
}
Чтобы получить фактический тип 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
Вы можете использовать Type.GetInterface () с искаженным именем.
private bool IsTAnEnumerable<T>(T x)
{
return null != typeof(T).GetInterface("IEnumerable`1");
}
Я бы вместо этого протестировал IEnumerable
, поскольку тип коллекции может реализовывать только IEnumerable
, он не должен реализовывать IEnumerable
.
Это также зависит: что вы имеете в виду с типом коллекции ? Вы можете иметь коллекцию, не реализуя ни один из этих интерфейсов.
Кроме того, помните только то, что вы используете дженерики, не забывайте другие базовые методы, в данном случае, такие как перегрузка , Я подозреваю, что вы планируете что-то вроде этого:
void SomeFunc<T>(T t)
{
if (IsCollectionCase(t))
DoSomethingForCollections()
else
DoSOmethingElse();
}
Это было бы гораздо лучше обработать как:
void SomeFunc(IEnumerable t)
{
DoSomethingForCollections()
}
void SomeFunc<T>(T t)
{
DoSomethingElse()
}