If I get some values from the database in C#, they are type object. Now I want to convert this values typesafe to load them into my object which represents a datarow more or less. So I thought it would be nice to create a generic extend-method for extend object.
So I build the following:
public static T ConvertToType<T>(this object value)
{
T returnValue = default(T);
if (value != DBNull.Value)
{
returnValue = (T)value;
}
return returnValue;
}
So I can use this to convert the different values from the given datarow and if the database stores null value I get the default type.
For example:
foreach (DataRow row in myTable.Rows)
{
MyClass myObject = new MyClass();
myObject.Id = row["ID"].ConvertToType<int>();
}
This works for compile time but it seems not possible to cast object to int for example. So I thought all value types have to be handled manually.
So I extend the first Code-Block:
public static T ConvertToType<T>(this object value)
{
T returnValue = default(T);
if (value != DBNull.Value)
{
if (wert is int)
{
rueckgabe = Convert.ToInt32(wert);
}
//else if All Value-Types are following...
else
{
returnValue = (T)value;
}
}
return returnValue;
}
But for sure the compiler now tells me that target type T can't be converted to int. This is quite clear.
Is someone out there who got a well solution for this issue? Or is this not as simple as I hoped.
This has already been implemented.
you can do row.Field<int>("ID")
the extension method is under System.Data namespace
for nullable fields, you can do row.Field<int?>("ID") since .Field returns null instead of default(T) for DBNull
Try this: Convert.ChangeType
public static T ConvertTo<T>(this object value)
{
T returnValue = default(T);
if (value is T)
{
returnValue = (T)value;
}
else
{
try
{
returnValue = (T)Convert.ChangeType(value, typeof(T));
}
catch (InvalidCastException)
{
returnValue = default(T);
}
}
return returnValue;
}
Maybe you should think of not catching the InvalidCastException here. If you can imagine that the default type-value could be of some use in your program it could be better to let the calling method handle the exception.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With