Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用一组密封类创建模板_C# - Fatal编程技术网

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()
。类型问题立即消失。你可以有一个
列表这些类看起来相同是不够的,它们必须是相同的/有一些共同点,所以很不幸泛型在这里帮不了你。