public static void SendEmail(String from, String To, String Subject, String HTML, String AttachmentPath = null, String AttachmentName = null, MediaTypeNames AttachmentType = null)
{
....
// Add an attachment if required
if (AttachmentPath != null)
{
var ct = new ContentType(MediaTypeNames.Text.Plain);
using (var a = new Attachment(AttachmentPath, ct)
{
Name = AttachmentName,
NameEncoding = Encoding.UTF8,
TransferEncoding = TransferEncoding.Base64
})
{
mailMessage.Attachments.Add(a);
}
}
....
}
ご覧のとおり、MediaTypeNames AttachmentType
はエラーをスローします:
'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters
これに対処する最良の方法は何ですか?
静的な型をパラメーターとしてメソッドに渡すことはできません。インスタンス化する必要があり、static
クラスのインスタンスを作成できないためです。
推奨されませんが、Staticクラスの使用をパラメーターとしてシミュレートできます。次のようなインスタンスクラスを作成します。
public class Instance
{
public Type StaticObject { get; private set; }
public Instance(Type staticType)
{
StaticObject = staticType;
}
public object Call(string name, params object[] parameters)
{
MethodInfo method = StaticObject.GetMethod(name);
return method.Invoke(StaticObject, parameters);
}
public object Call(string name)
{
return Call(name, null);
}
}
次に、静的クラスを使用する関数:
private static void YourFunction(Instance instance)
{
instance.Call("TheNameOfMethodToCall", null);
}
たとえばinstance.Call:
そして、このように使用します:
static void Main(string[] args)
{
YourFunction(new Instance(typeof(YourStaticClass)));
Console.ReadKey();
}
最善の対処法は、最後のパラメーターを削除することです。タイプは静的であるため、インスタンスへの参照は必要なく、関数本体からそのメンバーを参照できます。
静的型をラップしてインターフェースまたは別の非静的クラスをラップし、それをパラメーターとして追加できます。理想的ではありませんが、その回避策です。または、単にメソッド本体自体で静的型を参照するだけです
引数には別のタイプを使用してください。
メソッドの引数は、インスタンスへの参照を受け入れることができる型にする必要があるため、静的クラスにはできません。
パラメータのタイプとして静的クラスを送信し、関数で使用する変数名を付けます。これは、新しい変数が静的クラスへの参照であるため機能します。グローバル変数の問題に対処する必要があります。メソッド内の変数として静的クラスを使用する場合は、グローバル変数の問題を回避するために、それをパラメーターとして渡す必要があります。これは、80年代の基本的な構造化プログラミング101です。
メソッドでそのパラメーターを使用しているようには見えません。とにかくMediaTypeNames
をインスタンス化することはできないため、削除するだけです。