मुझे यकीन है कि मुझे इंटरवेब के आसपास कहीं और प्रेरणा मिली है लेकिन मुझे अब मूल स्रोत नहीं मिल रहा है। वैसे भी, आप नीचे दिए गए एक उपयोगिता वर्ग जो DataReader पर एक विस्तार विधि को परिभाषित करने की अनुमति देता है, इस तरह लगता है:
public static class DataReaderExtensions
{
public static TResult Get<TResult>(this IDataReader reader, string name)
{
return reader.Get<TResult>(reader.GetOrdinal(name));
}
public static TResult Get<TResult>(this IDataReader reader, int c)
{
return ConvertTo<TResult>.From(reader[c]);
}
}
उपयोग:
reader.Get<bool?>("columnname")
या
reader.Get<int?>(5)
यहाँ उपयोगिता वर्ग को सक्षम करने के है :
public static class ConvertTo<T>
{
// 'Factory method delegate', set in the static constructor
public static readonly Func<object, T> From;
static ConvertTo()
{
From = Create(typeof(T));
}
private static Func<object, T> Create(Type type)
{
if (!type.IsValueType) { return ConvertRefType; }
if (type.IsNullableType())
{
return (Func<object, T>)Delegate.CreateDelegate(typeof(Func<object, T>), typeof(ConvertTo<T>).GetMethod("ConvertNullableValueType", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(new[] { type.GetGenericArguments()[0] }));
}
return ConvertValueType;
}
// ReSharper disable UnusedMember.Local
// (used via reflection!)
private static TElem? ConvertNullableValueType<TElem>(object value) where TElem : struct
{
if (DBNull.Value == value) { return null; }
return (TElem)value;
}
// ReSharper restore UnusedMember.Local
private static T ConvertRefType(object value)
{
if (DBNull.Value != value) { return (T)value; }
return default(T);
}
private static T ConvertValueType(object value)
{
if (DBNull.Value == value)
{
throw new NullReferenceException("Value is DbNull");
}
return (T)value;
}
}
संपादित करें:
public static bool IsNullableType(this Type type)
{
return
(type.IsGenericType && !type.IsGenericTypeDefinition) &&
(typeof (Nullable<>) == type.GetGenericTypeDefinition());
}
क्या आप जानते हैं कि डेटा रीडर ["BOOL_FLAG"] और डेटा रीडर ["INT_VALUE"] में मौजूद वास्तविक मूल्य क्या है? – Jonas