Определение, является ли Тип Анонимным Типом [дубликат]

Мне лично нравится решение Мира, но если Вы абсолютно требуете только одной возвращенной строки (как я недавно имел), В SQL Server MS 2005/2008 Вы может "сложить" два запроса с помощью CTE

with NullRows (countOf)
AS
(
    SELECT count(*) 
    FORM table 
    WHERE [processed_timestamp] IS NOT NULL
)
SELECT count(*) AS nulls, countOf
FROM table, NullRows
WHERE [processed_timestamp] IS NULL
GROUP BY countOf

Hope, которому это помогает

24
задан xyz 30 October 2009 в 16:11
поделиться

5 ответов

Несмотря на то, что анонимный тип является обычным типом, вы можете использовать некоторые эвристики:

public static class TypeExtension {

    public static Boolean IsAnonymousType(this Type type) {
        Boolean hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0;
        Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType");
        Boolean isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType;

        return isAnonymousType;
    }
}

Еще одна хорошая эвристика, которую можно использовать, - если имя класса является допустимым именем C # (генерируются анонимные типы без допустимых имен классов C # - используйте для этого регулярное выражение).

37
ответ дан 28 November 2019 в 22:47
поделиться

В метаданных и CLR нет таких терминов, как анонимные типы. Анонимные типы - это исключительно функция компилятора.

2
ответ дан 28 November 2019 в 22:47
поделиться

Не существует языковой конструкции C #, которая позволяла бы вам сказать: «Это анонимный тип?». Вы можете использовать простую эвристику, чтобы приблизительно определить, является ли тип анонимным, но можно обмануть людей, кодирующих IL вручную или используя язык, где такие символы, как> и <, допустимы в идентификаторах.

public static class TypeExtensions {
  public static bool IsAnonymousType(this Type t) {
    var name = t.Name;
    if ( name.Length < 3 ) {
      return false;
    }
    return name[0] == '<' 
        && name[1] == '>' 
        && name.IndexOf("AnonymousType", StringComparison.Ordinal) > 0;
}
5
ответ дан 28 November 2019 в 22:47
поделиться

Может быть полезно узнать, почему вы хотите это знать. Если вы выполните следующее:

var myType = new { Name = "Bill" };
Console.Write( myType.GetType().Name  );

... вы увидите что-то вроде "<> f__AnonymousType0`1" в качестве имени типа. В зависимости от ваших требований вы можете предположить, что тип, начинающийся с <>, содержащий "AnonymousType" и символ обратной кавычки, - это то, что вы ищете.

1
ответ дан 28 November 2019 в 22:47
поделиться

Кажется, анонимные типы получают DebuggerDisplayAttribute , помещенный на них, где Type = "" .

Изменить: Но только когда вы компилируете в режиме отладки. Черт.

1
ответ дан 28 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: