User 11061201 Ответов: 1

Альтернатива Nameof() для .NET


Как бы вы закодировали альтернативу NameOf с помощью отражения? Я использую VS 2010 и имени не имеется. Мне нужно получить имена всех членов любого типа в иерархии структуры.

Structure Market
    Public Vehicle As Vehicle
    Public Place As String
End Structure

Structure Vehicle
    Public [Color] As Color
   
End Structure

Usage:
Dim Market As String = NameOf(GetType(Market)) ' "Market"
Dim Vehicle As String = NameOf(GetType(New Market().Vehicle)) '"Vehicle" or "Market.Vehicle"
Dim Place As String = NameOf(GetType(New Market().Place)) '"Place" or "Market.Place"


Что я уже пробовал:

Function NameOf(Of T)(ByVal expression As T) As String

End Function

0x01AA

Скорее всего, вы ничего не найдете...Оператор Nameof: новая функция C# 6.0[^]

j snooze

GetType(???).FullName не работает для вас?

[no name]

Да, но мне также нужно имя переменной, а не только имя ее базового типа.

1 Ответов

Рейтинг:
8

Dave Kreskowiak

Рефлексия не будет работать, потому что в вашем примере каждый вызов к GetType собирается вернуться System.String, или каков бы ни был тип переменной. Вы не найдете свое имя переменной ни в одном экземпляре программы. Type класс.

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

class Program
{
    static void Main(string[] args)
    {
        string Market = string.Empty;

        Console.WriteLine(Ext.GetNameOf(() => Market));
    }

}

public static class Ext
{
    public static string GetNameOf<T>(Expression<Func<T>> expression)
    {
        var body = (MemberExpression)expression.Body;

        return body.Member.Name;
    }
}


[no name]

Это перегрузка для параметров типа

Dim market2 As Market 'structure
Dim structName$ = GetNameOf(Of Market)() 'returns 
MarketPublic 
Function GetNameOf(Of T)() As String             
    Return GetType(T).Name    
End Function