2010-11-18 83 views
1

我一直在寻找很多,但我还没有发现任何关于此问题的信息。我正在制作我的应用程序的日志,并且正在打印各种类型的变量及其值。我想为我接收的每个对象作为参数以及我返回的每个对象都做同样的事情。所以我返回一个类型化数据集(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

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

在编译时,该方法为普通数据集类型实例化,而T为数据集类型。

为了解决这个问题,只需使用的parameter.GetType()代替typeof(T)

+0

我不完全理解你。在编译时,对IncomingDataSet的引用应该用MyDataSet类型来解决,或者我缺少一些东西... – EAmez 2010-11-23 09:41:45

+0

哦!我使用的是GetType()方法,因为我没有使用typeof(T) – EAmez 2010-11-23 09:43:11

+0

在编译时,incomingDataset的类型为System.Data.DataSet – 2010-11-23 11:01:28

相关问题