我有一些无法重写的代码密封的类。 (因此,我不能使这些类实现相同的接口)。
我有几个函数可以为此类提供相同的功能:
SELECT
(
SELECT id FROM t2
WHERE id = ANY ( ARRAY_AGG( tf.id ) ) AND amount = MAX( tf.amount )
) id,
name,
MAX(amount) ma,
SUM( ratio )
FROM t2 tf
GROUP BY name
(当然也实现了委托CreatorCreator(sealClassN)(但没有使用模板,因为每次的操作都非常不同))
我想创建一个:
void fN(int i, sealedClassN sc)
{
list.Add(new delegateCreator(sc));
button.Click += list.[i]._delegate;
}
有没有办法做到这一点。 谢谢您的帮助
答案 0 :(得分:2)
我认为您无法做到。您的T : T1 or T2 ...
想法存在的问题是您没有为参数设置共享成员。
考虑一下
public class Type1
{
public void M()
{
}
}
public class Type2
{
public void M()
{
}
}
public static class Extension
{
public static void A<T>(T obj) where T : Type1 or Type2
{
obj.M();
}
}
两个类都有一个方法M()
,但对于编译器来说却是不一样的,因为它们没有声明此方法的共享类型。
答案 1 :(得分:2)
不幸的是,这不可能直接实现。我可以建议以下替代方法:
方法1:改为通过delegateCreator
:
// call as fN(i, new delegateCreator(sc))
//
void fN(int i, delegateCreator dc)
{
list.Add(dc);
button.Click += list.[i]._delegate;
}
选项2:如果您有一个更复杂的函数,该函数仅有条件地创建一个delegateCreator
,则可以传递一个lambda表达式作为参数:
// call as fN(i, () => new delegateCreator(sc))
//
void fN(int i, Func<delegateCreator> dcfunc)
{
if (someCondition)
{
list.Add(dcfunc.Invoke());
button.Click += list.[i]._delegate;
}
}