我已经进行了很多搜索,但是没有找到关于此问题的任何信息。我正在记录我的应用程序,并且正在打印变量类型及其值。我想对作为参数接收的每个对象以及返回的每个对象执行相同的操作。因此,我将返回类型化的数据集(例如,定义为MyDataSetType的MyDataSet),但无法检索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()
?
我希望我已经解释得足够清楚了。预先感谢。
这是因为typeof(T)
与传入的数据集类型无关。
在编译时,该方法针对普通的Datset类型实例化,而T的类型为Dataset。
要解决它,只需使用parameter.GetType()
而不是typeof(T)