Poniżej prezentuję kilka metod rozszerzających (extension method), które napisałem jakiś czas temu i do dziś wykorzystuję w swoich projektach.
IsAssignableFromAny
Sprawdza czy dany obiekt jest pochodną któregoś z podanych typów.
public static bool IsAssignableFromAny(this object value, params Type[] args)
{
foreach (Type t in args)
{
if (value.GetType().IsAssignableFrom(t))
{
return true;
}
}
return false;
}
Przykład:
public class A {}
public class B {}
public class Boo : A {}
Boo x = new Boo();
bool x.IsAssignableFromAny(typeof(A), typeof(B));
EqualsAny
Sprawdza czy dany obiekt jest równy którejś z wartości z listy argumentów.
public static bool EqualsAny(this T value, params T[] args)
{
foreach (T t in args)
{
if (value.Equals(t))
{
return true;
}
}
return false;
}
Przykład:
int x = 5;
bool result = x.EqualsAny(1, 2, 3, 5, 7, 9);
Default
Sprawdza czy wartość obiektu jest pusta (null). Jeśli nie to zwraca ten obiekt, w przeciwnym przypadku zwraca wartość domyślną.
public static T Default(this T value, T defaultValue)
{
return value == null ? defaultValue : value;
}
Przykład:
int? x = null;
int? y = x.Default(5);
ChangeType
Zmienia typ danego obiektu na podany. Metoda ta dobrze radzi sobie z typami Generic.
public static object ChangeType(this object value, Type conversionType)
{
if (conversionType == null)
{
throw new ArgumentNullException("conversionType");
}
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
{
return null;
}
NullableConverter nullableConverter = new NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}
return Convert.ChangeType(value, conversionType);
}
Przykład:
object x = 5.0;
object y = x.ChangeType(typeof(int));
ConvertTo
Skrócona i zarazem generyczna wersja ChangeType.
public static T ConvertTo(this object value)
{
return (T)ChangeType(value, typeof(T));
}
Przykład:
object x = 5.0;
object y = x.ConvertTo();
Between
Sprawdza czy dana wartość liczbowa typu int zawiera się w przedziale. Równie dobrze można dodać klony tej metody dla: double, single, float.
public static bool Between(this int value, int min, int max)
{
return (value > min && value < max);
}
Przykład:
bool result = 5.Between(1, 3);
Kolejnym razem kilka pomocniczych metod rozszerzających i zarazem skracających działania na string'ach.