web-dev-qa-db-ja.com

C#の静的型はパラメーターとして使用できません

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

これに対処する最良の方法は何ですか?

21
Tom Gullen

静的な型をパラメーターとしてメソッドに渡すことはできません。インスタンス化する必要があり、staticクラスのインスタンスを作成できないためです。

23
user596075

推奨されませんが、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:

  • 最初のパラメータは、呼び出す静的クラスのメソッドの名前です
  • 2番目のパラメーターは、メソッドに渡す引数のリストです。

そして、このように使用します:

    static void Main(string[] args)
    {

        YourFunction(new Instance(typeof(YourStaticClass)));

        Console.ReadKey();

    }
6
csblo

最善の対処法は、最後のパラメーターを削除することです。タイプは静的であるため、インスタンスへの参照は必要なく、関数本体からそのメンバーを参照できます。

1
Primary Key

静的型をラップしてインターフェースまたは別の非静的クラスをラップし、それをパラメーターとして追加できます。理想的ではありませんが、その回避策です。または、単にメソッド本体自体で静的型を参照するだけです

1
aqwert

引数には別のタイプを使用してください。

メソッドの引数は、インスタンスへの参照を受け入れることができる型にする必要があるため、静的クラスにはできません。

1
Andrew Cooper

パラメータのタイプとして静的クラスを送信し、関数で使用する変数名を付けます。これは、新しい変数が静的クラスへの参照であるため機能します。グローバル変数の問題に対処する必要があります。メソッド内の変数として静的クラスを使用する場合は、グローバル変数の問題を回避するために、それをパラメーターとして渡す必要があります。これは、80年代の基本的な構造化プログラミング101です。

0
Nikolai

メソッドでそのパラメーターを使用しているようには見えません。とにかくMediaTypeNamesをインスタンス化することはできないため、削除するだけです。

0
user370770