Как я нахожу тип экземпляра объекта вызывающей стороны текущей функции?

Почему Windows 7 не принимает sha256timestamp.ws.symantec.com timestamp?

blockquote>

Необходимо проверить, установлено ли KB3033929 в Windows7. 111]
Windows7 не будет проверять подписи только SHA256 без KB3033929.

7
задан notso 2 April 2009 в 18:47
поделиться

5 ответов

Есть ли кто-либо, кто может показать мне, как реализовать нулевой аргумент CreateLog (), который завоевывает репутацию от подкласса а не класса объявления?

Я не думаю, что Вы сможете сделать это путем рассмотрения стекового фрейма.

В то время как Ваш класс IMReceiver, вызов к CreateLog метод находится в MessageReceiver класс. Стековый фрейм должен сказать Вам, откуда метод называют, или это не было бы никакое использование, таким образом, он всегда собирается сказать MessageReceiver

Если Вы звонили CreateLog явно в Вашем IMReceiver и другие классы, затем это работает, поскольку стековый фрейм показывает метод, называемый в производном классе (потому что это на самом деле).

Вот лучшая вещь, которую я могу придумать:

class BaseClass{
  public Log log = Utils.CreateLog();
}
class DerivedClass : BaseClass {
  public DerivedClass() {
    log = Utils.CreateLog();
  }
}

Если мы прослеживаем создание журналов, мы получаем это:

new BaseClass();
# Log created for BaseClass

new DerivedClass();
# Log created for BaseClass
# Log created for DerivedClass

Второй 'журнал, созданный для производного класса', перезаписывает переменную экземпляра, таким образом, Ваш код будет вести себя правильно, Вы будете просто создавать журнал BaseClass, который сразу выброшен. Это кажется hacky и плохо мне, я просто пошел бы с определением параметра типа в конструкторе или использовании дженерика.

По моему скромному мнению, определение типа является более чистым, чем ввод по абсолютному адресу вокруг в стековом фрейме так или иначе

Если можно получить его, не смотря на стековый фрейм, опции значительно расширяются

1
ответ дан 7 December 2019 в 12:25
поделиться

Обычно, MethodBase. ReflectedType имел бы Вашу информацию. Но, согласно MSDN StackFrame. GetMethod:

Метод, который в настоящее время выполняется, может быть наследован от базового класса, хотя это называют в производном классе. В этом случае свойство ReflectedType объекта MethodBase, который возвращается GetMethod, определяет базовый класс, не производный класс.

что означает, что Вам, вероятно, не повезло.

2
ответ дан 7 December 2019 в 12:25
поделиться

Я думаю, что можно задавать неправильный вопрос. В первую очередь, регистратор должен быть статичным к каждому классу - каждый класс должен объявить свой собственный регистратор (чтобы гарантировать, что об именах классов правильно сообщают И позволить выборочное создание отчетов сообщений журнала, фильтрованных проектом или пространством имен из файла конфигурации.

Во-вторых, кажется, что Вы создали этот метод только для идентификации названия класса вызова? Раз так мы используем этот шаблонный код, который вставляется в каждый класс:

private static ILog log = 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

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

Мои извинения, если у Вас были различные причины кодирования Util. CreateLog () метод.

2
ответ дан 7 December 2019 в 12:25
поделиться

Попробуйте StackTrace. Метод GetFrames. Это возвращает массив всех объектов StackFrame в стеке вызовов. Ваша вызывающая сторона должна быть в индексе один.

class Program
{
    static void Main(string[] args)
    {
        Logger logger = new Logger();
        Caller caller = new Caller();
        caller.FirstMethod(logger);
        caller.SecondMethod(logger);
    }
}

public class Caller
{
    public void FirstMethod(Logger logger)
    {
        Console.Out.WriteLine("first");
        logger.Log();
    }

    public void SecondMethod(Logger logger)
    {
        Console.Out.WriteLine("second");
        logger.Log();
    }
}

public class Logger
{
    public void Log()
    {
        StackTrace trace = new StackTrace();
        var frames = trace.GetFrames();
        Console.Out.WriteLine(frames[1].GetMethod().Name);
    }
}

это производит

первый FirstMethod второй SecondMethod

0
ответ дан 7 December 2019 в 12:25
поделиться

Идите по проверке стека на базовый класс - отношения производного класса.

        var type = new StackFrame(1).GetMethod().DeclaringType;
        foreach (var frame in new StackTrace(2).GetFrames())
            if (type != frame.GetMethod().DeclaringType.BaseType)
                break;
            else
                type = frame.GetMethod().DeclaringType;
        return CreateLogWithName(type.FullName);

Можно хотеть вставить проверку, что исследованные методы являются конструкторами. Но сценарий, где подкласс инстанцирует суперкласса в методе кроме, он - конструктор, может все еще хотеть текущее поведение.

0
ответ дан 7 December 2019 в 12:25
поделиться
Другие вопросы по тегам:

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