2
var type = data.ClientBaseObject.GetType();
var newClientObject = GetDataContextedObject(type, data.ClientBaseObject);


private object GetDataContextedObject(Type type, object jobObject)
    {
        switch (type.Name.ToUpper())
        {
            case "JOBNUMBER":
                {
                    return GetObjectFromDataContext<JobNumber>(jobObject);
                }
            case "NA_HEADER":
                {
                    return GetObjectFromDataContext<NA_Header>(jobObject);
                }
        }
        return null;
    }

        private  object GetObjectFromDataContext<T>(object jobObject) where T: class, IJobID
        {
            var newObject = jobObject as T;
            return _dc.GetTable<T>().FirstOrDefault(j => j.JobID == newObject.JobID);
        }

上記のコードでは、各クラスの type.Name を取得してそれぞれのケースを作成する代わりに、 をGetObjectFromDataContextにできる方法があるかどうか疑問に思っています。GetObjectFromDataContext<type>これはできますか?

質問が明確でない場合はお知らせください。

4

2 に答える 2

0

許容される型はすべて共通のインターフェースを実装していますか? もしそうなら、はい。GetObjectFromDataContext基本型をジェネリック引数として受け入れるように変更します。

ただし、ジェネリック引数はコンパイル時に決定する必要があります。それ以外の場合、機能はどのようにタイプ セーフを提供しますか? objectその時点ですべてを渡しているだけかもしれません。

編集:更新ごと。

実行時にパラメーターを渡すことができる必要がありTypeます。そうしないと、やりたいことができません。これはすべて実行時に行われるため、ジェネリック バージョンを選択的に呼び出す必要があります。同じ理由で、引数を取るのオーバーロードをGetTableType使用することはできません。を返すため、キャストが必要になりますITable

Typeパラメータを使用してこれを動的に行う必要がありますか?

于 2013-03-06T22:28:43.020 に答える
0

このように書くことができます:

private object GetDataContextedObject<T>(object jobObject)
{
    return GetObjectFromDataContext<T>(jobObject);
}
于 2013-03-06T22:29:44.957 に答える