C# 对仿制药有帮助吗?如何定义泛型方法?

C# 对仿制药有帮助吗?如何定义泛型方法?,c#,asp.net-mvc,generics,C#,Asp.net Mvc,Generics,是否可以创建定义类似于以下内容的泛型方法: public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper , object modelData) // TypeOfHtmlGenerator is a type that creates custom Html tags. //

是否可以创建定义类似于以下内容的泛型方法:

public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper
                                           , object modelData) 

// TypeOfHtmlGenerator is a type that creates custom Html tags. 
// GenerateWidget creates custom Html tags which contains Html representing the Widget.
公共静态字符串GenerateWidget(此HtmlHelper HtmlHelper
,对象模型数据)
//TypeOfHtmlGenerator是一种创建自定义Html标记的类型。
//GenerateWidget创建自定义Html标记,其中包含表示小部件的Html。
我可以使用此方法创建包含在任何类型Html标记中的任何类型的小部件


谢谢

是的,您可以编写此通用扩展方法。但是,由于它在函数签名中不使用任何类型参数,因此必须始终指定类型。这意味着您不能使用:

 string r = helper.GenerateWidget(modelData);
但您始终需要:

 string r = helper.GenerateWidget<SpecificHtmlGenerator, SpecificWidget>(modelData);
string r=helper.GenerateWidget(modelData);

是的,您可以编写此通用扩展方法。但是,由于它在函数签名中不使用任何类型参数,因此必须始终指定类型。这意味着您不能使用:

 string r = helper.GenerateWidget(modelData);
但您始终需要:

 string r = helper.GenerateWidget<SpecificHtmlGenerator, SpecificWidget>(modelData);
string r=helper.GenerateWidget(modelData);

您可能需要添加一些改进,因为看起来您必须在方法中实例化这些类:

public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper
                                           , object modelData)
    where TypeOfHtmlGen: new()
    where WidgetType: new()
{
    // Awesome stuff
}
公共静态字符串GenerateWidget(此HtmlHelper HtmlHelper
,对象模型数据)
其中TypeOfHtmlGen:new()
其中WidgetType:new()
{
//棒极了
}
此外,您可能希望小部件和html gen实现某种接口或基类:

public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper
                                           , object modelData)
    where TypeOfHtmlGen: HtmlGenBaseClass, new()
    where WidgetType: WidgetBaseClass, new()
{
    // Awesome stuff
}
公共静态字符串GenerateWidget(此HtmlHelper HtmlHelper
,对象模型数据)
其中TypeOfHtmlGen:HtmlGenBaseClass,new()
其中WidgetType:WidgetBaseClass,new()
{
//棒极了
}

您可能需要添加一些改进,因为看起来您必须在方法中实例化这些类:

public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper
                                           , object modelData)
    where TypeOfHtmlGen: new()
    where WidgetType: new()
{
    // Awesome stuff
}
公共静态字符串GenerateWidget(此HtmlHelper HtmlHelper
,对象模型数据)
其中TypeOfHtmlGen:new()
其中WidgetType:new()
{
//棒极了
}
此外,您可能希望小部件和html gen实现某种接口或基类:

public static string GenerateWidget<TypeOfHtmlGen, WidgetType>(this HtmlHelper htmlHelper
                                           , object modelData)
    where TypeOfHtmlGen: HtmlGenBaseClass, new()
    where WidgetType: WidgetBaseClass, new()
{
    // Awesome stuff
}
公共静态字符串GenerateWidget(此HtmlHelper HtmlHelper
,对象模型数据)
其中TypeOfHtmlGen:HtmlGenBaseClass,new()
其中WidgetType:WidgetBaseClass,new()
{
//棒极了
}

这里的界面更合适吗?是的,在上面贴一个主体,你就有了一个工厂方法。还有其他问题吗?@Scott,你能详细解释一下吗?我不熟悉模式,我不太清楚你的意思。Thanks@Charlie,你能解释一下你的意思吗?谢谢你,只是你已经朝着正确的方向走了,我想知道我是否遗漏了问题的一部分。你有一个看起来不错的方法签名,它只需要里面的代码。这里的接口更合适吗?是的,在上面贴一个主体,你就有了一个工厂方法。还有其他问题吗?@Scott,你能详细解释一下吗?我不熟悉模式,我不太清楚你的意思。Thanks@Charlie,你能解释一下你的意思吗?谢谢你,只是你已经朝着正确的方向走了,我想知道我是否遗漏了问题的一部分。你有一个看起来不错的方法签名,它只需要里面的代码。我知道你可以使用类似于
where-TypeOfHtmlGen:new()
的语法指定约束,但我不确定
new()
的意思。你能解释一下吗?ThanksFrom MSDN:新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数。我知道您可以使用类似于
where-TypeOfHtmlGen:new()
的语法指定约束,但我不确定
new()
的含义。你能解释一下吗?ThanksFrom MSDN:新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数。