如何从类型化DataSet获取基础类型

时间:2010-11-18 17:02:53

标签: c# reflection types strongly-typed-dataset gettype

我一直在搜索,但我还没有找到关于这个问题的任何内容。我正在记录我的应用程序,我正在打印变量类型及其值。我希望对我收到的每个对象都做同样的参数,对于我返回的每个对象也是如此。所以我返回一个类型化的数据集(MyDataSet,其定义为MyDataSetType,例如)但我无法检索MyDataSetType名称。

我有一个给定数据集的方法,返回包含所有内容的字符串。像这样:

    string GetLogStringFromDataSetParameter(System.Data.DataSet incomingDataSet)
    {
        StringBuilder strReturn = new StringBuilder();
        strReturn.Append("DataSet (type ");
        strReturn.Append(GetTypeName(incomingDataSet));
        strReturn.Append("). ");
        // .. do some validations
        strReturn.Append("Contains ");
        strReturn.Append(incomingDataSet.Tables.Count);
        strReturn.Append(" tables.");
        for (int i = 0; i < incomingDataSet.Tables.Count; i++)
        {
            System.Data.DataTable table = incomingDataSet.Tables[i];
            strReturn.Append(" Tabla " + table.TableName + " (" + i + ") ");
            strReturn.Append(<Method to list table content>);
        }//yes, this could have been a foreach loop...
        return FormatStringToLog(strReturn);
     }  //end

如您所见,我使用自己的方法GetTypeName来检索我的类型化数据集的名称。我通过这个网站进行了一些调查后得到了这个方法:

public static string GetTypeName<T>(T parameter)
{
    string strReturn = typeof(T).Name;
    if (strReturn.IndexOf("Nullable") >= 0)
        strReturn = Nullable.GetUnderlyingType(typeof(T)).Name;
    else if (strReturn.IndexOf("List") >= 0)
    {
        strReturn = "List of " + typeof(T).GetGenericArguments()[0].Name;
        if (strReturn.IndexOf("Nullable") >= 0)
            strReturn = "List of " +  Nullable.GetUnderlyingType(typeof(T).GetGenericArguments()[0]).Name;
    }
    return strReturn;
}

当我在GetLogStringFromDataSetParameter方法内部时,如果我尝试typeof(MyDataSet),它会正确返回MyDataSetType。但是当我调用GetTypeName时,它只返回DataSet,即泛型类型。为什么是这样?有没有办法正确检索MyDataSetType而不直接调用typeof()?

我希望我已经清楚地解释了一切。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是因为typeof(T)与传入的数据集类型无关。

在编译时,该方法实例化为普通的Datset类型,T的类型为Dataset。

要解决此问题,只需使用parameter.GetType()代替typeof(T)