c# - Unboxing and casting in one statement in generic method -


i have little utility method looks so:

/// <summary> /// replaces dbnull value default of type specified /// </summary> /// <typeparam name="t">resulting type</typeparam> /// <param name="p_this">object check dbnull</param> /// <returns>p_this if not dbnull.value, else default(t)</returns> public static t replacedbnullwithdefault<t>(this object p_this) {   return p_this == system.dbnull.value ? default(t) : (t)p_this; } 

in specific scenario, taking record out of data table , taking specific field out of using weak types, , specific field i'm getting long being boxed object. example reproduces follows:

var obj = 2934l; int num = obj.replacedbnullwithdefault<int>(); 

it fails invalidcastexception, @ (t)p_this.

i understand why, boxed long cannot cast directly int, , trying fails:

object mylong = 234l; int myint = (int)mylong; 

however, unboxing , casting works fine:

object mylong = 234l; int myint = (int)(long)mylong; 

how can work around in method?

you can try this:

public static t replacedbnullwithdefault<t>(this object p_this) t : struct {     return          p_this == system.dbnull.value              ? default(t)              : (t)convert.changetype(p_this, typeof(t)); } 

nevertheless exception if try apply function not-convertible type.

so better cast value manually known type.


Comments

Popular posts from this blog

unity3d - Rotate an object to face an opposite direction -

angular - Is it possible to get native element for formControl? -

javascript - Why jQuery Select box change event is now working? -