0

これが可能かどうかはわかりませんが、長い調査の結果、決定的なものは見つかりませんでした.

辞書から新しいオブジェクト (それ自体が新しいタイプ) を動的に作成しようとしています。つまり、キーと値が値を返すプロパティになるというキーと値があるとします。私はこのように使用できるもの:

サンプルコード

public T getObject(Dictionary<string, string> myDict)
{
 // make a new object type with the keys and values of the dictionary. 
 // sample values in dictionary:
 // id : 112345
 // name: "greg"
 // gender: "m"
 // Eventually also make the interface?
}

// Somewhere else:
var myNewObject = helper.getObject();
// what is expected here is that when I type myNewObject. 
// I get id, name, gender as suggestions
int id = myNewObject.Id;

私にとって重要なのは、そこからインテリセンスを引き出すことです。だから私は入力することができobject.、すべてのキーで提案が出てきます。この方法では、値にアクセスするために事前に辞書を知る必要はありません (または、辞書を使用するだけです)。

私はクレイを調べましたが、それを使用して必要なインテリセンスを取得する方法が明確ではありません。これについての投稿も見つけました。

さらに、私はImpromptuInterfaceをチェックしましたが、両方のドキュメントが貧弱であるか、理解できません。

これが Clay で可能である場合 (確かにそのように思われます)、Clay を参照しない他のプロジェクトでライブラリとして機能するようにするにはどうすればよいですか?

何か不明な点がある場合、またはこれが重複している場合は、遠慮なくコメントしてください。

4

1 に答える 1

5

IntelliSense を機能させるには、結果の型がコンパイル時にわかっている必要があります。したがって、 を使用している時点で、objectその具体的な型 (または、少なくとも、必要なだけ具体的な型またはインターフェイス - アクセスしたいすべてのメソッドとプロパティを持つ) を知っている必要があります。

実際に何をしようとしているのかを理解するのは難しいですが、コンパイル時に型わかっている場合は、ヘルパー メソッドをジェネリックにすることができます。

public T GetObject<T>(Dictionary<...> dictionary)

これにより、呼び出しサイトで期待するタイプを指定できます。

var obj = GetObject<SomeType>(dictionary);

これが合理的でないと思われる場合は、明示的なキャストを使用することもできます。

var obj = (SomeType)helper.getObject();

具体的な型がわからない場合は、少なくとも、使用できる共通のインターフェイス (または基本クラス) が必要です。次に、このインターフェイスを実装するために、ランタイム生成型が作成されます。ただし、コンパイル時に認識されているメンバーにしかアクセスできません。コンパイラは、実行時に辞書に存在する可能性のあるすべてのキーをどのように知るのでしょうか? ある種のコントラクトに対してコードを作成しようとしています。そのコントラクトをインターフェイスで形式化し (たとえば)、実行時に生成された型にこのインターフェイスを実装させます。

于 2015-07-02T10:06:31.543 に答える