Как создать пользовательский класс EventArgs, у которого нет доступного конструктора? - PullRequest
0 голосов
/ 04 апреля 2010

У меня проблема; Я использую внешнюю библиотеку, где одно конкретное событие имеет свои собственные события; без конструктора. Если я хочу создать свое собственное событие, используя эти события, как я могу?

Я дам больше подробностей, если меня спросят, но я не уверен, что именно я должен дать. :)

Ответы [ 5 ]

6 голосов
/ 04 апреля 2010

Другие ответы предлагают несколько способов (или хаков), как вы могли бы сделать это.

Однако я бы сказал, что если автор библиотеки не дал вам никакого способа создать новый экземпляр своего пользовательского класса EventArgs, то вам не следует этого делать. Если вы хотите создать собственное событие, вам следует определить новый тип delegate и новый тип EventArgs (даже если вы дублировали класс, уже определенный в библиотеке).

Для этого есть веские причины:

  • Библиотека может измениться, и пользовательский тип EventArgs, который они предоставляют, может больше не соответствовать вашим потребностям.
  • Библиотеке может потребоваться передать какой-то особый объект или специальный идентификатор в EventArgs, поэтому вы не сможете правильно создать экземпляр.

Поскольку вы можете инициировать событие только из класса, в котором оно определено, вы, вероятно, определяете новое событие в классе (используя ключевое слово event), поэтому нет реальной причины, по которой вы не могли бы объявить ваш собственный делегат. Или не могли бы вы предоставить более подробную информацию о том, как вы инициируете событие?

1 голос
/ 04 апреля 2010

Очевидно, что разработчики библиотеки сделали конструктор внутренним, чтобы вы не делали именно то, что вы пытаетесь сделать - к лучшему или к худшему. Поэтому все, что вы делаете, будет взломом.

Вы можете использовать Reflection для создания экземпляра класса - см. Activator.CreateInstance.

Еще более опасным может быть повторное использование экземпляра объекта args, который вы получили и сохранили, но это опасно - кто знает, какие внутренние данные могут содержать.

1 голос
/ 04 апреля 2010

Используйте Reflector, чтобы узнать, как его создает внешняя библиотека.

1 голос
/ 04 апреля 2010

Создайте новый тип, который наследуется от этого класса EventArgs, и используйте его. Скорее всего, существующий тип EventArgs - abstract, поэтому вы можете создать новый тип, который будет наследовать от него, а полиморфная поддержка C # позволит вам передавать новый тип всем методам, которые ожидают экземпляр базового типа.

0 голосов
/ 04 апреля 2010

Вы можете попытаться получить экземпляр класса, используя System.Runtime.Serialization.FormatterServices. Пример:

public class Foo
{
    private Foo()
    {
    }
}

...

Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));
...