C#のジェネリック関数で型を渡すにはどうすればよいですか?

トーマス

私は次のコードを持っています:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
    public class SignalRHub : Attribute
    {
        public readonly string Route;

        public SignalRHub(string Route)
        {
            this.Route = Route;
        }
    }

    [SignalRHub("hubpath")]
    public class TestHub : Hub
    {
        ...
    }

これは、パスを知るための属性を持つSignalRハブを定義します。

SignalRHub属性を使用してハブを動的に登録したいので、すべてのハブを検索するための次のコードがあります。

        // find all hubs
        var Hubs =
            from Assemblies in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
            from Types in Assemblies.GetTypes()
            let Attributes = Types.GetCustomAttributes(typeof(SignalRHub), true)
            where Attributes?.Length > 0
            select new { Type = Types };

        var HubsList = Hubs.ToList();

そして、それらを登録したいのですが、ここで問題が発生します。

        foreach (var H in HubsList)
        {
            // get the route attribute
            var Route = string.Empty;
            var Attributes = Attribute.GetCustomAttributes(H.Type);
            foreach (var Attribute in Attributes)
            {
                if (Attribute is SignalRHub A)
                {
                    Route = A.Route;
                    break;
                }
            }

            // register the hub
            if (string.IsNullOrEmpty(Route))
            {
                Logging.Warn($"[Hub] {H.Type.Name} does not have a path, skipping");
            }
            else
            {
                Logging.Info($"[Hub] Registering {H.Type.Name} with path {Route}");
                Application.UseSignalR(R => R.MapHub<H>(Route)); <- this won't compile
            }

MapHubでは、Tがハブから派生する必要があります。HがTestHubタイプである場合、問題はないはずですが、その構文は機能していません。

どうすればこれを機能させることができますか?

アンドリー・シェフチェンコ

私の解決策(リフレクションを使用)

using System;
using System.Reflection;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Connections;
//somewhere in your code
private static readonly MethodInfo mapperMethodInfo = 
    typeof(HubRouteBuilder).GetMethod(
        "MapHub",
        new Type [] { 
            typeof(PathString)
        },
        null
    );

// in your mapping code
// replace this:
Application.UseSignalR(R => R.MapHub<H>(Route));  

// with this
Application.UseSignalR(R => 
{
   // pay attention to use of H.Type, R and Route variables
   mapperMethodInfo.MakeGenericMethod(H.Type).Invoke(R, new object [] { Route });
});

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

型ジェネリック関数ポインタを渡すにはどうすればよいですか?

分類Dev

c#ジェネリック型パラメーターをキャストして内部関数に渡すにはどうすればよいですか?

分類Dev

この関数をジェネリック型にするにはどうすればよいですか?

分類Dev

TypeScript:この関数のジェネリックに型を明示的に渡すにはどうすればよいですか?

分類Dev

C#ジェネリッククラスのTに2つの可能な型を渡すにはどうすればよいですか?

分類Dev

別のジェネリック基本クラスにC#ジェネリック型制約を追加するにはどうすればよいですか?

分類Dev

C#でオープンジェネリックの型パラメーターの数を取得するにはどうすればよいですか?

分類Dev

C ++でジェネリックstringToVector関数を作成するにはどうすればよいですか?

分類Dev

C#でジェネリック型引数を指定するときに `dynamic`を使用するにはどうすればよいですか?

分類Dev

C#でジェネリック制約の有効な型オブジェクトを取得するにはどうすればよいですか?

分類Dev

ジェネリック関数型にオプションの引数型を含めるにはどうすればよいですか?

分類Dev

Swiftでジェネリック型の引数を取る関数を再割り当てするにはどうすればよいですか?

分類Dev

ジェネリック関数の値を作成するにはどうすればよいですか?

分類Dev

Objective-Cのジェネリック型を見つけるにはどうすればよいですか?

分類Dev

C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

分類Dev

C# で、2 つの異なる型でジェネリックスを使用するにはどうすればよいですか?

分類Dev

ジェネリック型パラメーターを使用して関数のベクトルを作成するにはどうすればよいですか?

分類Dev

TypeScriptのジェネリック関数で有界型を使用するにはどうすればよいですか?

分類Dev

重要な関係を持つ複数のジェネリック型を持つメンバーを宣言するにはどうすればよいですか?

分類Dev

MLReaderで関数をジェネリックにするにはどうすればよいですか

分類Dev

指定されたジェネリック型で関数型を作成するにはどうすればよいですか?

分類Dev

高階関数に渡されるジェネリック関数がvoidの戻り値の型を持つようにするにはどうすればよいですか?

分類Dev

ジェネリック型をジェネリックメソッドに渡すにはどうすればよいですか?

分類Dev

ジェネリック関数で「typeofT」を参照するにはどうすればよいですか?

分類Dev

ジェネリック型のクラスを取得するにはどうすればよいですか?

分類Dev

GsonのTypeTokenのジェネリック型を配置するにはどうすればよいですか?

分類Dev

数値ベクトルをジェネリックベクトル関数に渡すにはどうすればよいですか?

分類Dev

c#ジェネリッククラス:特定の型で使用されるメンバー関数を制限するにはどうすればよいですか?

分類Dev

C#で抽象内部型を持つジェネリックでパターンマッチングを行うにはどうすればよいですか?

Related 関連記事

  1. 1

    型ジェネリック関数ポインタを渡すにはどうすればよいですか?

  2. 2

    c#ジェネリック型パラメーターをキャストして内部関数に渡すにはどうすればよいですか?

  3. 3

    この関数をジェネリック型にするにはどうすればよいですか?

  4. 4

    TypeScript:この関数のジェネリックに型を明示的に渡すにはどうすればよいですか?

  5. 5

    C#ジェネリッククラスのTに2つの可能な型を渡すにはどうすればよいですか?

  6. 6

    別のジェネリック基本クラスにC#ジェネリック型制約を追加するにはどうすればよいですか?

  7. 7

    C#でオープンジェネリックの型パラメーターの数を取得するにはどうすればよいですか?

  8. 8

    C ++でジェネリックstringToVector関数を作成するにはどうすればよいですか?

  9. 9

    C#でジェネリック型引数を指定するときに `dynamic`を使用するにはどうすればよいですか?

  10. 10

    C#でジェネリック制約の有効な型オブジェクトを取得するにはどうすればよいですか?

  11. 11

    ジェネリック関数型にオプションの引数型を含めるにはどうすればよいですか?

  12. 12

    Swiftでジェネリック型の引数を取る関数を再割り当てするにはどうすればよいですか?

  13. 13

    ジェネリック関数の値を作成するにはどうすればよいですか?

  14. 14

    Objective-Cのジェネリック型を見つけるにはどうすればよいですか?

  15. 15

    C#ジェネリックスパラメーターとしてオブジェクト型を持たないジェネリックメソッドの引数として渡された型を取得するにはどうすればよいですか?

  16. 16

    C# で、2 つの異なる型でジェネリックスを使用するにはどうすればよいですか?

  17. 17

    ジェネリック型パラメーターを使用して関数のベクトルを作成するにはどうすればよいですか?

  18. 18

    TypeScriptのジェネリック関数で有界型を使用するにはどうすればよいですか?

  19. 19

    重要な関係を持つ複数のジェネリック型を持つメンバーを宣言するにはどうすればよいですか?

  20. 20

    MLReaderで関数をジェネリックにするにはどうすればよいですか

  21. 21

    指定されたジェネリック型で関数型を作成するにはどうすればよいですか?

  22. 22

    高階関数に渡されるジェネリック関数がvoidの戻り値の型を持つようにするにはどうすればよいですか?

  23. 23

    ジェネリック型をジェネリックメソッドに渡すにはどうすればよいですか?

  24. 24

    ジェネリック関数で「typeofT」を参照するにはどうすればよいですか?

  25. 25

    ジェネリック型のクラスを取得するにはどうすればよいですか?

  26. 26

    GsonのTypeTokenのジェネリック型を配置するにはどうすればよいですか?

  27. 27

    数値ベクトルをジェネリックベクトル関数に渡すにはどうすればよいですか?

  28. 28

    c#ジェネリッククラス:特定の型で使用されるメンバー関数を制限するにはどうすればよいですか?

  29. 29

    C#で抽象内部型を持つジェネリックでパターンマッチングを行うにはどうすればよいですか?

ホットタグ

アーカイブ