Как получить строчное название объекта, даже когда пустой, в C# [дубликат]

63
задан Dan Violet Sagmiller 30 July 2019 в 16:17
поделиться

6 ответов

Джефф прав. Это все равно, что спросить, какой торт был бы в пустой коробке без метки.

В качестве альтернативы ответу Фортрана вы также можете сделать:

string TypeNameLower<T>(T obj) {
   return typeof(T).Name.ToLower(CultureInfo.InvariantCulture);
}

string TypeNameLower(object obj) {
   if (obj != null) { return obj.GetType().Name.ToLower(CultureInfo.InvariantCulture); }
   else { return null; }
}

string s = null;
TypeNameLower(s); // goes to the generic version

Таким образом, C # выберет общий во время компиляции, если он знает достаточно о типе, который вы передаете.

66
ответ дан 24 November 2019 в 16:12
поделиться
if (o == null) return "null";
else return o.GetType().Name.ToLower();

простое решение простой задачи :-p

15
ответ дан 24 November 2019 в 16:12
поделиться

Насколько мне известно, вы не можете. Null указывает на отсутствие значения и не отличается для разных типов.

3
ответ дан 24 November 2019 в 16:12
поделиться

Как отмечают другие, вы не можете. На самом деле это хорошо известная проблема с языками, которые допускают чистые нулевые ссылки на объекты. Один из способов обойти это - использовать шаблон «Нулевой объект». Основная идея состоит в том, что вместо использования null для пустых ссылок вы назначаете ему экземпляр объекта «ничего не делать». Например:

public class Circle
{
    public virtual float Radius { get; set; }

    public Circle(float radius)
    {
        Radius = radius;
    }
}

public class NullCircle : Circle
{
    public override float Radius 
    { 
        get { return float.NaN; }
        set { }
    }

    public NullCircle() { }
}

Затем вы можете передать экземпляр NullCircle вместо null , и вы сможете проверить его тип, как в вашем коде.

8
ответ дан 24 November 2019 в 16:12
поделиться

Нет понятия, что нулевая строка отличается от нулевой. Массив отличается от нулевой строки. Изнутри своей функции вы не можете определить имя типа.

Более конкретно, экземпляр ссылочного класса (внутри) включает «указатель» на информацию о типе объекта. Когда ввод нулевой, такого указателя нет, поэтому информация о типе не существует.

2
ответ дан 24 November 2019 в 16:12
поделиться

Рассмотрим этот код:

    public class MyClass1{}
    public class MyClass2{}

    public static void Test1()
    {
        MyClass1 one = null;
        MyClass2 two = (MyClass2) (object) one;

        one = new MyClass1();
        //invalid cast exception
        two = (MyClass2)(object) one;
    }

Тип времени выполнения нулевого экземпляра - объект , по крайней мере, с точки зрения безопасности типов.

0
ответ дан 24 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

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