File: src\Framework\MS\Internal\SystemDataHelper.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//---------------------------------------------------------------------------
//
// <copyright file="SystemDataHelper.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// Description: Helper methods for code that uses types from System.Data.
//
//---------------------------------------------------------------------------
 
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
 
namespace MS.Internal
{
    internal static class SystemDataHelper
    {
        // return true if the list is a DataView
        internal static bool IsDataView(IBindingList list)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.IsDataView(list) : false;
        }
 
        // return true if the item is a DataRowView
        internal static bool IsDataRowView(object item)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.IsDataRowView(item) : false;
        }
 
        // return true if the value is null in the SqlTypes sense
        internal static bool IsSqlNull(object value)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.IsSqlNull(value) : false;
        }
 
        // return true if the type is nullable in the SqlTypes sense
        internal static bool IsSqlNullableType(Type type)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.IsSqlNullableType(type) : false;
        }
 
        // ADO DataSet exposes some properties that cause problems involving
        // identity and change notifications.  We handle these specially.
        internal static bool IsDataSetCollectionProperty(PropertyDescriptor pd)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.IsDataSetCollectionProperty(pd) : false;
        }
 
        // Intercept GetValue calls for certain ADO properties
        internal static object GetValue(object item, PropertyDescriptor pd, bool useFollowParent)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.GetValue(item, pd, useFollowParent) : null;
        }
 
        // return true if DBNull is a valid value for the given item and column.
        // The column may be specified directly by name, or indirectly by indexer: Item[arg]
        internal static bool DetermineWhetherDBNullIsValid(object item, string columnName, object arg)
        {
            SystemDataExtensionMethods extensions = AssemblyHelper.ExtensionsForSystemData();
            return (extensions != null) ? extensions.DetermineWhetherDBNullIsValid(item, columnName, arg) : false;
        }
 
        // return a null value appropriate for the given SqlNullable type
        internal static object NullValueForSqlNullableType(Type type)
        {
            // some SqlTypes are structs with a Null field.
            FieldInfo nullField = type.GetField("Null", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
            if (nullField != null)
            {
                return nullField.GetValue(null);
            }
 
            // Others are classes with a Null property.
            PropertyInfo nullProperty = type.GetProperty("Null", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
            if (nullProperty != null)
            {
                return nullProperty.GetValue(null, null);
            }
 
            Debug.Assert(false, "Could not find Null field or property for SqlNullable type");
            return null;
        }
    }
}