【问题标题】:How to get underlying type from typed DataSet如何从类型化 DataSet 中获取基础类型
【发布时间】:2011-05-12 04:15:29
【问题描述】:

我已经搜索了很多,但我没有找到任何关于这个问题的信息。我正在记录我的应用程序,并且正在打印变量类型及其值。我想对作为参数接收的每个对象以及返回的每个对象都执行相同的操作。所以我返回了一个类型化的数据集(例如定义为 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。为什么是这样?有什么方法可以在不直接调用typeof() 的情况下正确检索MyDataSetType

我希望我已经把一切解释得足够清楚了。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    那是因为typeof(T)与传入的Dataset类型无关。

    在编译时,该方法被实例化为普通的数据集类型,并且 T 是数据集类型。

    要解决它,只需使用parameter.GetType() 而不是typeof(T)

    【讨论】:

    • 我不完全理解你。在编译时,对 IncomingDataSet 的引用应该使用 MyDataSet 类型来解决,或者我缺少一些东西......
    • 哦!我正在使用 GetType() 方法,因为我无法使用 typeof(T)
    • 在编译时你的incomingDataset 是System.Data.DataSet 类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2023-02-07
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多