Как я использую отражение для получения свойств, явно реализовывая интерфейс?

В MySQL 5.7 и Ubuntu 16.04 отредактируйте файл mysql.cnf.

$ sudo nano /etc/mysql/conf.d/mysql.cnf

Включите sql_mode следующим образом и сохраните файл.

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Обратите внимание, что , в моем случае я удалил режим STRICT_TRANS_TABLES и ONLY_FULL_GROUP_BY.

Сделав это, он сохранит конфигурацию режима навсегда. Иначе, если вы просто обновите @@ sql_mode через MySQL, потому что он перезагрузится при перезагрузке машины / службы.

После этого, чтобы модифицированная конфигурация приняла действие, перезапустите службу mysql:

$ sudo service mysql restart

Попробуйте получить доступ к mysql:

$ mysql -u user_name -p

Если вы можете войти в систему и получить доступ к консоли MySQL, это нормально. Отлично!

НО, если мне нравится, вы сталкиваетесь с ошибкой «неизвестной переменной sql_mode», которая указывает, что sql_mode является опцией для mysqld, вам нужно будет вернуться, отредактировать файл mysql.cnf снова и измените значение [mysql] на [mysqld]. Перезапустите службу MySQL и выполните последний тест, пытающийся войти в консоль MySQL. Вот оно!

22
задан Nosredna 18 June 2009 в 23:01
поделиться

6 ответов

Мне пришлось изменить ответ Джейкоба Карпентера, но он работает нормально. nobugz также работает, но Jacobs более компактен.

var explicitProperties =
from method in typeof(TempClass).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
where method.IsFinal && method.IsPrivate
select method;
1
ответ дан 29 November 2019 в 05:07
поделиться

Метод считывания свойства и метод set явно реализованного интерфейсного свойства имеют необычный атрибут. Это - свойство IsFinal, Правда, даже когда это не член запечатанного класса. Попробуйте этот код для проверки моего утверждения:

  foreach (AssemblyName name in Assembly.GetEntryAssembly().GetReferencedAssemblies()) {
    Assembly asm = Assembly.Load(name);
    foreach (Type t in asm.GetTypes()) {
      if (t.IsAbstract) continue;
      foreach (MethodInfo mi in t.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)) {
        int dot = mi.Name.LastIndexOf('.');
        string s = mi.Name.Substring(dot + 1);
        if (!s.StartsWith("get_") && !s.StartsWith("set_")) continue;
        if (mi.IsFinal)
          Console.WriteLine(mi.Name);
      }
    }
  }
4
ответ дан 29 November 2019 в 05:07
поделиться

Вот измененное решение на основе реализации, данной в это сообщение в блоге :

var explicitProperties =
    from prop in typeof(TempClass).GetProperties(
        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
    let getAccessor = prop.GetGetMethod(true)
    where getAccessor.IsFinal && getAccessor.IsPrivate
    select prop;

foreach (var p in explicitProperties)
    Console.WriteLine(p.Name);
3
ответ дан 29 November 2019 в 05:07
поделиться

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

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

1
ответ дан 29 November 2019 в 05:07
поделиться

Код Jacob пропускает фильтр:

        var props = typeof(TempClass).GetInterfaces().Where(i => i.Name=="TempInterface").SelectMany(i => i.GetProperties());
        foreach (var prop in props)
            Console.WriteLine(prop);
0
ответ дан 29 November 2019 в 05:07
поделиться

Я думаю, что вам нужен класс System.Reflection.InterfaceMapping.

Type ifaceType = typeof(TempInterface);
Type tempType = typeof(TempClass);
InterfaceMapping map = tempType.GetInterfaceMap(ifaceType);
for (int i = 0; i < map.InterfaceMethods.Length; i++)
{
    MethodInfo ifaceMethod = map.InterfaceMethods[i];
    MethodInfo targetMethod = map.TargetMethods[i];
    Debug.WriteLine(String.Format("{0} maps to {1}", ifaceMethod, targetMethod));
}
22
ответ дан 29 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

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