Активатор. CreateInstance - Как создать экземпляры классов, которые имеют параметризованных конструкторов

Вы можете использовать JOIN. Например:

SELECT
  IFNULL(OnSite.worksite_id, Documents.worksite_id) as `Worksite`,
  DATE(IFNULL(OnSite.timestamp, Documents.timestamp)) as `Date`,
  COUNT(DISTINCT OnSite.uid) as `Users_On_Site`,
  COUNT(Documents.worksite_id) as `Completed`
FROM OnSite
  LEFT JOIN Documents ON OnSite.worksite_id = Documents.worksite_id AND DATE(OnSite.timestamp) = DATE(Documents.timestamp)
GROUP BY `Date`, `Worksite`;
29
задан Kate Gregory 2 January 2013 в 21:38
поделиться

4 ответа

В конце концов я сделал что-то вроде этого - некоторые комментаторы все равно намекали на это решение.

Я в основном перебрал все доступные конструкторы и выбрал самый простой. Затем я создал нулевые данные для передачи в ctor (что я использую для этого подхода, это нормально)

Часть кода выглядит примерно так

// If we have a ctor that requires parameters then pass null values
if (requiresParameters)
{
    List<object> parameters = new List<object>();
    ParameterInfo[] pInfos = constructorInfos[0].GetParameters();

    foreach (ParameterInfo pi in pInfos)
    {
        parameters.Add(createType(pi.ParameterType));
    }

    return constructorInfos[0].Invoke(parameters.ToArray());
}
8
ответ дан 28 November 2019 в 01:26
поделиться

Activator.CreateInstance также имеет целую кучу перегрузок, одну из которых вы, возможно, захотите проверить: (Тип type, params object [] args). Просто укажите необходимые аргументы конструктора для второго параметра этого вызова.

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

0
ответ дан pezi_pink_squirrel 28 November 2019 в 01:26
поделиться

Имеется перегрузка, которая принимает аргументы как объект params [] :

object obj = Activator.CreateInstance(typeof(StringBuilder), "abc");

Подойдет ли это? В качестве альтернативы вы можете использовать отражение, чтобы найти правильный конструктор:

Type[] argTypes = new Type[] {typeof(string)};
object[] argValues = new object[] {"abc"};
ConstructorInfo ctor = typeof(StringBuilder).GetConstructor(argTypes);
object obj = ctor.Invoke(argValues);
48
ответ дан 28 November 2019 в 01:26
поделиться

Я использую этот метод, чтобы обойти проблему, с которой я столкнулся , и, похоже, он работает именно так, как я надеялся. :)

object instance = Activator.CreateInstance(
    typeof(OpCode),
    BindingFlags.NonPublic | BindingFlags.Instance,
    default(Binder),
    new object[] { stringname, pop, push, operand, type, size, s1, s2, ctrl, endsjmpblk, stack },
    default(CultureInfo));
1
ответ дан 28 November 2019 в 01:26
поделиться
Другие вопросы по тегам:

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