使用泛型进行代码自定义:C#



尝试使用泛型进行代码优化。然而,该程序可以工作,由于代码行冗余,我想尝试一次Generics,检查代码行的数量是否可以减少。我非常感谢您的帮助和反馈。

错误为type does not contain definition of Document

Print.cs
public class Print
{
public async Task<ResponseData> Get(Payload payload)
{
var FilePath = "";
try
{
MemoryStream memstream = new MemoryStream();     
if (payload?.Type?.ToLower() == "consolidated")
{
if (payload?.Month?.ToLower() == "july" || payload?.Year == "2022")
{
if (payload?.date != "")
{
if (payload?.PageID?.IndexOf(",") > -1)
{
AReport aReport = Adjustments.FillAReport(payload);
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(aReport.Document, filePath);
}
else
{
BReport bReport = Adjustments.FillBReport(payload, true);
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(bReport.Document, FilePath);
}
}
else
{
CReport cReport = Adjustments.FillCReport(payload);
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(cReport.Document, FilePath);
}
}
}
else
{
BReport bReport = Adjustments.FillBReport(payload, false);
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(bReport.Document, FilePath);

}
}

尝试在此处使用泛型。导出完成后,我正在尝试返回生成的PDF文件。

if (payload?.PageID?.IndexOf(",") > -1)
{
AReport aReport = Adjustments.FillAReport(payload);
FilePath = Generics.ExportContent<AReport>(aReport )
}
else
{
BReport bReport = Adjustments.FillBReport(payload, true);
FilePath = Generics.ExportContent<BReport>(bReport)
}
Generics.cs
public static string ExportContent<T>(this T type)
{
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(type.Document, FilePath); //Error
return FilePath;
}

对您看到的错误的解释可能有助于澄清泛型的用途或它们的工作方式。

public static string ExportContent<T>(this T input) // Changed the argument name for clarity
{
PdfExport pdf = new PdfExport();
FilePath = $"{Guid.NewGuid()}.pdf";
pdf.Export(input.Document, FilePath); //Error
return FilePath;
}

input的类型是什么?答案是它可以是任何东西。这取决于打电话的人。

如果有人调用ExportContent<string>(someString),那么当执行此操作时,类型为string

如果它们调用ExportContent<SomeOtherClass>(whatever),那么当执行时,类型为SomeOtherClass

在这个方法中,编译器不知道T会是什么。它可能是任何东西,这取决于调用者。

错误是因为您正试图使用input.Document属性。但是由于编译器不知道input是什么类型,所以它不知道是否存在Document属性。如果inputstring,则不存在Document属性。

编译器在保护你。它不希望您等到代码运行并调用方法,然后确定是否有Document属性,如果没有,则抛出异常。最好是在编译程序时能够看到错误并进行修复,而不是在运行程序时意外发生。

如果您有实现相同接口或从同一基类继承的不同类型的对象,并且它们都具有相同的Document属性,那么尝试使用泛型参数是有意义的。

例如,假设您可能传递给方法的所有对象都继承自这个基类:

public class MyBaseClass
{
public string Document { get; set; } // Guessing that it's a string. I don't know
}

然后你可以添加一个&方法声明的通用约束*,如下所示:

public static string ExportContent<T>(this T input) where T : MyBaseClass
{

现在T不可能只是什么。它必须是MyBaseClass或从它继承的东西。然后它将编译,因为它保证Document属性将始终存在。

这里有一个转折点:就你使用它的方式而言,你不需要泛型。

你可以这样做:

public static string ExportContent(this MyBaseClass input) where T : MyBaseClass
{

并且您仍然可以传递任何类型为MyBaseClass或从其继承的参数。如果您使用接口而不是基类,则同样有效。您可以传递实现接口的任何对象。

相关内容

  • 没有找到相关文章

最新更新