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

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

7 ответов

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

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

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
поделиться

Очень досадно, что C # не позволяет сделать такое определение. И это не похоже на вопрос, какой торт у вас будет в пустой коробке - объект состоит из двух независимых компонентов - «воплощения» объекта и информации о классе, который использовался для создания объекта. Тот факт, что к этой информации нелегко получить доступ, является упущением со стороны разработчиков C #.

Все, что вы можете сделать в качестве определения, - это довольно уродливый метод:

void Method(object obj)
{
if(obj is int)
{
//obj is of the int type
}
else if(obj is SomeComplexType)
{
//obj is of the SomeComplexType type
}
}

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

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

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