0

コマンドをデバイスに送信するプロジェクトに取り組んでいます。各コマンド オブジェクトは、デバイスがサポートする特定のコマンド (サポートする dll の API によって定義される) と 1 対 1 の関係にあります。

コマンドを定義する XML ファイルがあります。メソッド名とパラメーター (名前、型、および既定値) に名前を付けます。

私のアプリケーションは XML を読み取り、コマンド オブジェクトを作成します。値に関連付けられたパラメーター名を持つパラメーター ディクショナリがあります (型ごと)。

パラメータ ディクショナリを作成するときは、まず型を作成し、次にインスタンスを作成してから、ディクショナリを更新しました。

{
    theType = Type.GetType(paramType);
    var newInstance = Activator.CreateInstance(theType, true);
    parameterValueMap.Add(paramName, newInstance);
}

これは int などでは問題なく機能しますが、文字列型にはパラメーターなしのコンストラクターがないため、機能しません。

パラメーターなしのコンストラクターを持つ他の型が存在する可能性があるため、ソリューションを汎用的に保つ必要があります (文字列を具体的に処理するのではありません)。

誰かが解決策を手伝ってくれますか? パラメータの実際のインスタンス (および特定のケースでは文字列のインスタンス) を持たずに、パラメータを持つ型のインスタンスを作成する方法はありますか?

ありがとう -m

4

2 に答える 2

1

ジェネリックについて言及しているので、 adefault(T)が役立つ場合がありますが、それはnullクラス/インターフェイス用になります。便利な邪悪なトリックは次のとおりです。

T obj = (T)FormatterServices.GetUninitializedObject(typeof(T));

でも!これは純粋な悪であり、通常はデシリアライゼーション/マテリアライゼーション ライブラリ用に予約されています。これは、アドホックな使用を意図したものではありません。

おそらく最良の方法は、呼び出し元に方法を教えてもらうことです。たとえば、オプションのファクトリ パラメーターを追加します。

 void YourMethod<T>(..., Func<T> constructor = null)

次に、必要に応じて、呼び出し元はインスタンスを作成する手法を提供できます。だからあなたは持っています:

T obj = constructor == null ? (T)Activator.CreateInstance(typeof(T))
                            : constructor();

いずれにせよ、文字列は大きな問題です。間違いなく、文字列を特殊なケースにする必要があります。

于 2012-09-27T18:28:57.990 に答える
0

Activator.CreateInstance(type, ParseKeys(ID).ToArray())コードでa を使用します。ここで、はキーと値のペアIDの個別のリストであり、||ParseKeys()

    private static IEnumerable<object> ParseKeys(string keyString)
    {
        IEnumerable<string> keyStrings = keyString.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries); // Use this construction to enable splitting on multiple characters
        List<object> keys = new List<object>();
        foreach (var key in keyStrings)
        {
            var type = Type.GetType(key.Split("|")[0]);
            var value = key.Split("|")[1];
            var data = Convert.ChangeType(value, type);
            keys.Add(data);
        }
        return keys;
    }

明らかに、パラメーターを何らかの形式の文字列として表現できる必要があります。パラメーターなしのコンストラクターについてはテストしていませんが、int と文字列の両方で問題なく動作します。

于 2012-09-27T18:34:51.597 に答える