C# 如何使用一组密封类创建模板
我有几个密封的类来自一个我无法重写的代码。(因此,我不能让这些类实现相同的接口) 我有几个函数可以为这个类做同样的事情:C# 如何使用一组密封类创建模板,c#,C#,我有几个密封的类来自一个我无法重写的代码。(因此,我不能让这些类实现相同的接口) 我有几个函数可以为这个类做同样的事情: void fN(int i, sealedClassN sc) { list.Add(new delegateCreator(sc)); button.Click += list.[i]._delegate; } (当然,delegateCreator(sealedClassN)是实现的(但不使用模板,因为它每次所做的都非常不同)) 我想创建
void fN(int i, sealedClassN sc)
{
list.Add(new delegateCreator(sc));
button.Click += list.[i]._delegate;
}
(当然,delegateCreator(sealedClassN)是实现的(但不使用模板,因为它每次所做的都非常不同))
我想创建一个:
void f<sealedClass >(int i, sealedClass sc) with sealedClass : sealedClass1or or sealedClass2 or sealedClass3 ....
{
list.Add(new delegateCreator(sc));
button.Click += list.[i]._delegate;
}
f(内部i,密封等级sc)与密封等级:密封等级ClassOR或密封等级2或密封等级3。。。。
{
添加(新的授权创建者(sc));
按钮。单击+=列表。[i]。\u代表;
}
有没有办法做到这一点。
谢谢你的帮助我想你做不到。您的
T:T1或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();
}
}
公共类类型1
{
公屋
{
}
}
公共类类型2
{
公屋
{
}
}
公共静态类扩展
{
公共静态无效A(T obj),其中T:Type1或Type2
{
obj.M();
}
}
这两个类都有一个methode
M()
,但对于编译器来说,它是不同的,因为它们没有一个声明此methode的共享类型。我认为您无法做到这一点。您的T:T1或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();
}
}
公共类类型1
{
公屋
{
}
}
公共类类型2
{
公屋
{
}
}
公共静态类扩展
{
公共静态无效A(T obj),其中T:Type1或Type2
{
obj.M();
}
}
这两个类都有一个methode
M()
,但对于编译器来说,它并不相同,因为它们没有声明此methode的共享类型。不幸的是,这不可能直接实现。我可以提出以下备选方案:
选项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;
}
}
//作为fN(i,()=>新的委托创建者(sc))调用
//
void fN(int i,Func dcfunc)
{
如果(某些条件)
{
添加(dcfunc.Invoke());
按钮。单击+=列表。[i]。\u代表;
}
}
不幸的是,这不可能直接实现。我可以提出以下备选方案:
选项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;
}
}
//作为fN(i,()=>新的委托创建者(sc))调用
//
void fN(int i,Func dcfunc)
{
如果(某些条件)
{
添加(dcfunc.Invoke());
按钮。单击+=列表。[i]。\u代表;
}
}
您是否在询问扩展方法?在任何情况下,使用继承只是为了添加一个额外的方法可能会导致更多的麻烦,而不值得这么做。您真正想做的是什么?什么是delegateCreator
,为什么使用该列表?您已经使用+=
将多个事件处理程序添加到隐藏列表中。只要传递lambda,就不需要创建委托。列表具有索引器属性,因此您可以只编写list[i]
。很有可能您将事情过于复杂。例如,如果您传递的是Func而不是类,那么您就不再关心类本身,而不再关心delegateCreator()
。类型问题立即消失。你可以有一个列表这些类看起来相同是不够的,它们必须是相同的/有一些共同点,所以很不幸泛型在这里帮不了你。你是在问扩展方法吗?在任何情况下,使用继承只是为了添加一个额外的方法可能会导致更多的麻烦,而不值得这么做。您真正想做的是什么?什么是delegateCreator
,为什么使用该列表?您已经使用+=
将多个事件处理程序添加到隐藏列表中。只要传递lambda,就不需要创建委托。列表具有索引器属性,因此您可以只编写list[i]
。很有可能您将事情过于复杂。例如,如果您传递的是Func而不是类,那么您就不再关心类本身,而不再关心delegateCreator()
。类型问题立即消失。你可以有一个列表这些类看起来相同是不够的,它们必须是相同的/有一些共同点,所以很不幸泛型在这里帮不了你。