使用struct field作为参数

本文关键字:参数 field struct 使用 | 更新日期: 2023-09-27 18:18:12

我有这个类。

public class EmailManager
{
   public struct AttachmentFormats
   {
        public const string Excel = ".xlsx";        
        public const string Pdf = ".pdf";
   }
   private static bool SendEmail(string to, string from, ???)
   {
      /*??? is one of the AttachmentFormats*/
   }
}

当用户想要使用SendEmail时,我想限制他们只使用一个定义的attachmentformat。像

EmailManager.SendEmail("xxx","yy",EmailManager.AttachmentFormats.Excel);

这可能吗?

使用struct field作为参数

你需要enum而不是struct:

public enum AttachmentFormat
{
     xlsx = 0,
     pdf = 1
}
public class EmailManager
{
   private static bool SendEmail(string to, string @from, AttachmentFormat format)
   {
      switch(format)
      {
          case AttachmentFormat.pdf: 
          // logic 
          break;
          case AttachmentFormat.xlsx: 
          // logic 
          break;
      }
   }
}

另一个解决方案是创建实现该接口的接口和类:

public interface IAttachmentFormat {}
public sealed class PDFAttachmentFormat : IAttachmentFormat { } 
public sealed class XLSXAttachmentFormat : IAttachmentFormat { } 

然后检查SendEmail方法中的类型:

   private static bool SendEmail(string to, string @from, IAttachmentFormat format)
   {
      if(format is PDFAttachmentFormat) // some logic for pdf
      if(format is XLSXAttachmentFormat) // some logic for xlsx
   }

如果你想让你的类的用户调用SendEmail,那么它必须是公共的。

同样,我重复前面关于使用Enum而不是结构体的注释。通过上面Aram Kocharyan给出的实现,用户可以使用预定义的字符串,但不是强制的。没有什么可以阻止它们调用:

EmailManager.SendEmail("me","you","Any old string I can make up");

使用枚举方法:

EmailManager.SendEmail("me","you",EmailManager.AttachmentFormat.Excel);