using System;
using System.Linq;
public abstract class AbstractValidator<T> {
}
public class CreateTripValidator : AbstractValidator<int>
{}
public class CancelTripValidator : AbstractValidator<string>
{}
public class Test
{
public static void Main()
{
var validatorType = typeof(AbstractValidator<>);
Console.WriteLine(string.Join(",", validatorType.Assembly
.GetTypes()
.Where(t => IsSubclassOfRawGeneric(validatorType, t))
.Select(t => t.Name)
.ToArray()));
}
private static bool IsSubclassOfRawGeneric(Type baseType, Type derivedType) {
while (derivedType != null && derivedType != typeof(object)) {
var currentType = derivedType.IsGenericType ? derivedType.GetGenericTypeDefinition() : derivedType;
if (baseType == currentType) {
return true;
}
derivedType = derivedType.BaseType;
}
return false;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRvcjxUPiB7Cn0KCnB1YmxpYyBjbGFzcyBDcmVhdGVUcmlwVmFsaWRhdG9yIDogQWJzdHJhY3RWYWxpZGF0b3I8aW50Pgp7fQpwdWJsaWMgY2xhc3MgQ2FuY2VsVHJpcFZhbGlkYXRvciA6IEFic3RyYWN0VmFsaWRhdG9yPHN0cmluZz4Ke30KCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgdmFsaWRhdG9yVHlwZSA9IHR5cGVvZihBYnN0cmFjdFZhbGlkYXRvcjw+KTsKCQlDb25zb2xlLldyaXRlTGluZShzdHJpbmcuSm9pbigiLCIsIHZhbGlkYXRvclR5cGUuQXNzZW1ibHkKCQkJLkdldFR5cGVzKCkKCQkJLldoZXJlKHQgPT4gSXNTdWJjbGFzc09mUmF3R2VuZXJpYyh2YWxpZGF0b3JUeXBlLCB0KSkKCQkJLlNlbGVjdCh0ID0+IHQuTmFtZSkKCQkJLlRvQXJyYXkoKSkpOwoJfQoJCglwcml2YXRlIHN0YXRpYyBib29sIElzU3ViY2xhc3NPZlJhd0dlbmVyaWMoVHlwZSBiYXNlVHlwZSwgVHlwZSBkZXJpdmVkVHlwZSkgewoJICAgIHdoaWxlIChkZXJpdmVkVHlwZSAhPSBudWxsICYmIGRlcml2ZWRUeXBlICE9IHR5cGVvZihvYmplY3QpKSB7CgkgICAgICAgIHZhciBjdXJyZW50VHlwZSA9IGRlcml2ZWRUeXBlLklzR2VuZXJpY1R5cGUgPyBkZXJpdmVkVHlwZS5HZXRHZW5lcmljVHlwZURlZmluaXRpb24oKSA6IGRlcml2ZWRUeXBlOwoJICAgICAgICBpZiAoYmFzZVR5cGUgPT0gY3VycmVudFR5cGUpIHsKCSAgICAgICAgICAgIHJldHVybiB0cnVlOwoJICAgICAgICB9CgkgICAgICAgIAoJICAgICAgICBkZXJpdmVkVHlwZSA9IGRlcml2ZWRUeXBlLkJhc2VUeXBlOwoJICAgIH0KCSAgICByZXR1cm4gZmFsc2U7Cgl9Cgp9