Вы можете использовать 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`;
В конце концов я сделал что-то вроде этого - некоторые комментаторы все равно намекали на это решение.
Я в основном перебрал все доступные конструкторы и выбрал самый простой. Затем я создал нулевые данные для передачи в 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());
}
Activator.CreateInstance также имеет целую кучу перегрузок, одну из которых вы, возможно, захотите проверить: (Тип type, params object [] args). Просто укажите необходимые аргументы конструктора для второго параметра этого вызова.
Убедитесь, что вы обрабатываете исключения здесь, так как легко передать неправильные параметры или что-то изменить в конструкторах типа позже, что нарушит его.
Имеется перегрузка, которая принимает аргументы как объект 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);
Я использую этот метод, чтобы обойти проблему, с которой я столкнулся , и, похоже, он работает именно так, как я надеялся. :)
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));