Как я могу получить определение правильного текста универсального типа с помощью отражения?

Строгие стандарты: нестатический метод [& lt; class> :: & lt; method>] не следует называть статически

Происходит при попытке вызова не- статический метод для класса, поскольку он был статичным, и вы также имеете флаг E_STRICT в настройках error_reporting().

Пример:

class HTML {
   public function br() {
      echo '
'; } }

HTML::br() или $html::br()

Вы действительно можете избежать этой ошибки, не добавляя E_STRICT к error_reporting(), например

error_reporting(E_ALL & ~E_STRICT);

, поскольку, как и для PHP 5.4.0 и выше, E_STRICT включен в E_ALL [ ref ]. Но это не рекомендуется. Решение состоит в том, чтобы определить вашу предполагаемую статическую функцию как фактическую static:

public static function br() {
  echo '
'; }

или вызвать функцию условно:

$html = new HTML();
$html->br();

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

26
задан stakx supports GoFundMonica 10 September 2015 в 10:50
поделиться

5 ответов

Нет никакого встроенного способа получить это представление в.Net Платформе. А именно, потому что нет никакого способа получить его корректный. Существует большое количество конструкций, которые не являются представимыми в синтаксисе стиля C#. Например, "<> нечто" является допустимым именем типа в IL, но не может быть представлено в C#.

Однако при поиске довольно хорошего решения это может быть рука, реализованная справедливо быстро. Ниже решения будет работать на большинство ситуаций. Это не обработает

  1. Вложенные типы
  2. Недопустимые Имена C#
  3. Несколько других сценариев

Пример:

public static string GetFriendlyTypeName(Type type) {
    if (type.IsGenericParameter)
    {
        return type.Name;
    }

    if (!type.IsGenericType)
    {
        return type.FullName;
    }

    var builder = new System.Text.StringBuilder();
    var name = type.Name;
    var index = name.IndexOf("`");
    builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index));
    builder.Append('<');
    var first = true;
    foreach (var arg in type.GetGenericArguments())
    {
        if (!first)
        {
            builder.Append(',');
        }
        builder.Append(GetFriendlyTypeName(arg));
        first = false;
    }
    builder.Append('>');
    return builder.ToString();
}
29
ответ дан JaredPar 28 November 2019 в 06:53
поделиться

Этим вечером я играл немного с дополнительными методами, и я пытался найти ответ для Вашего вопроса. Вот результат: это - код без гарантий.;-)

internal static class TypeHelper
{
    private const char genericSpecialChar = '`';
    private const string genericSeparator = ", ";

    public static string GetCleanName(this Type t)
    {
        string name = t.Name;
        if (t.IsGenericType)
        {
            name = name.Remove(name.IndexOf(genericSpecialChar));
        }
        return name;
    }

    public static string GetCodeDefinition(this Type t)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("{0}.{1}", t.Namespace, t.GetCleanName());
        if (t.IsGenericType)
        {
            var names = from ga in t.GetGenericArguments()
                        select GetCodeDefinition(ga);
            sb.Append("<");
            sb.Append(string.Join(genericSeparator, names.ToArray()));
            sb.Append(">");
        }
        return sb.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        object[] testCases = { 
                                new Dictionary<string, DateTime>(),
                                new List<int>(),
                                new List<List<int>>(),
                                0
                            };
        Type t = testCases[0].GetType();
        string text = t.GetCodeDefinition();
        Console.WriteLine(text);
    }
}
4
ответ дан Fabrizio C. 28 November 2019 в 06:53
поделиться
string text = dictionary.ToString();

обеспечивает почти, что Вы просите:

System.Collections.Generic.Dictionary`2[System.String,System.DateTime]
2
ответ дан Walt Gaber 28 November 2019 в 06:53
поделиться

Я не думаю, что.NET имеет что-либо встроенное, которое сделало бы это, таким образом, необходимо будет сделать это сами. Я думаю, что отражательные классы предоставляют достаточно информации для восстановления имени типа в этой форме.

0
ответ дан Vilx- 28 November 2019 в 06:53
поделиться

Я полагаю, что можно передать

Система. Строка, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

в Type.Parse(). Это - полностью определенное имя типа, я думаю.

0
ответ дан bluish 28 November 2019 в 06:53
поделиться
Другие вопросы по тегам:

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