Как получить базовый тип из типизированного DataSet - PullRequest
1 голос
/ 18 ноября 2010

Я много искал, но ничего не нашел по этому вопросу. Я делаю журнал своего приложения и печатаю типы переменных и их значения. Я хочу сделать то же самое для каждого объекта, который я получаю в качестве параметра, и для каждого объекта, который я возвращаю тоже. Поэтому я возвращаю типизированный набор данных (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 Ответ

1 голос
/ 18 ноября 2010

Это связано с тем, что typeof(T) не имеет ничего общего с входящим типом набора данных.

Во время компиляции метод создается для простого типа набора данных, а T имеет тип Dataset.

Чтобы решить эту проблему, просто используйте parameter.GetType() вместо typeof(T)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...