Как создать пользовательский класс EventArgs, у которого нет доступного конструктора?

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

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


person Xenoprimate    schedule 04.04.2010    source источник


Ответы (5)


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

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

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

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

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

person Tomas Petricek    schedule 04.04.2010

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

person Andrew Hare    schedule 04.04.2010
comment
А, это я уже пробовал. Прежде всего; члены, которые я хотел установить с помощью конструктора моего унаследованного класса, были частными для родительского класса, и, во-вторых, это не позволило бы мне создать конструктор в моем унаследованном классе. Кроме того, я думаю, что пользовательский класс не является абстрактным, поскольку я использую его экземпляры. - person Xenoprimate; 04.04.2010

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

person SLaks    schedule 04.04.2010

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

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

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

person EMP    schedule 04.04.2010
comment
Это при условии, что дизайнеры библиотеки знали, что делали. Я видел свою справедливую долю, которая этого не сделала. - person nuzzolilo; 24.05.2014

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

public class Foo
{
    private Foo()
    {
    }
}

...

Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));
person Anthony Pegram    schedule 04.04.2010