Прежде всего, извините, если об этом уже спрашивали. Я провел довольно сложный поиск и ничего подобного не нашел, но, возможно, что-то упустил.
А теперь к вопросу: я пытаюсь вызвать конструктор через отражение, но безуспешно. По сути, у меня есть объект, который я хочу клонировать, поэтому я ищу конструктор копирования по его типу и затем хочу вызвать его. Вот что у меня есть:
public Object clone(Object toClone) {
MethodBase copyConstructor = type.GetConstructor(
new Type[] { toClone.GetType() });
return method.Invoke(toClone, new object[] { toClone }); //<-- doesn't work
}
Я вызываю вышеуказанный метод примерно так:
List<int> list = new List<int>(new int[] { 0, 1, 2 });
List<int> clone = (List<int>) clone(list);
Теперь обратите внимание, что метод invoke, который я использую, это invoke MethodBase
. ConstructorInfo
предоставляет метод invoke, который работает, если вызывается так:
return ((ConstructorInfo) method).Invoke(new object[] { toClone });
Однако я хочу использовать метод MethodBase
, потому что в действительности вместо поиска конструктора копирования каждый раз я буду хранить его в словаре, а словарь содержит как методы, так и конструкторы, так что это Dictionary<MethodBase>
, а не Dictionary<ConstructorInfo>
.
Конечно, я мог бы привести к ConstructorInfo
, как и выше, но я бы предпочел избежать приведения и использовать метод MethodBase
напрямую. Я просто не могу определить правильные параметры.
Любая помощь? Большое спасибо.
EDIT
Benjamin
Большое спасибо за ваши предложения. На самом деле я делал именно то, что вы предлагаете в вашем втором редактировании, за исключением (и это большое «кроме») мой словарь был где
class ClonerMethod {
public MethodBase method;
public bool isConstructor;
...
public Object invoke(Object toClone) {
return isConstructor ?
((ConstructorInfo) method).Invoke(new object[] { toClone }) : //<-- I wanted to avoid this cast
method.Invoke(toClone, null);
}
}
А потом я позвонил ClonerMethod
1033 * на то, что нашел в словаре. Я не добавил код, который касается всего этого, потому что я искал ответ только о том, как вызвать Invoke для ConstructorInfo
с использованием MethodBase
метода Invoke
, поэтому я не хотел добавлять ненужные информация и слишком много кода для вас, ребята, чтобы прочитать. Тем не менее, мне намного больше нравится ваше использование Func<,>
, поэтому я перехожу на это. Хорошим дополнением также является создание общего метода Clone
, но в моем случае вызывающая сторона не знает тип объекта, поэтому вместо этого я оставлю его не универсальным.
Я не знал о Func<,>
, и если бы я знал о лямбда-операторе, я забыл (мне действительно не нужно было что-то подобное раньше), так что я действительно многому научился из вашего ответа. Я всегда люблю изучать новые вещи, и это очень пригодится в будущем, поэтому большое спасибо! :)