C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 異なる型制約のジェネリック メソッドを呼び出す


(過去ログ 122 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■73049 / inTopicNo.1)  異なる型制約のジェネリック メソッドを呼び出す方法?
  
□投稿者/ Tom (1回)-(2014/08/13(Wed) 23:24:07)

分類:[C#] 

2014/08/13(Wed) 23:24:32 編集(投稿者)

C#でジェネリックを使った関数を作っているのですが、
次のように、あるジェネリック メソッドから
異なる型制約のジェネリック メソッドを呼び出す方法はあるでしょうか?

↓こういう余所のライブラリのクラスの関数があるとして
public static class Utility
{
  public static void FunctionForHoge<T>()
    where T : Hoge
  {
   ...
  }

  public static void FunctionForFuga<T>()
    where T : Fuga
  {
   ...
  }
}

↓こういう感じに呼び出したい
void Func<T>(T piyo)
{
  if (piyo is Hoge) Utility.FunctionForHoge<T>(); <--制約が違うため呼び出せないのを何とかしたい
  else if (piyo is Fuga) Utility.FunctionForFuga<T>(); <--ここも
  else ...
}

どんな設計やねん!と突っ込まれるかもしれませんが、
何か面白い方法があったらぜひ教えてくださいm(_ _)m

引用返信 編集キー/
■73053 / inTopicNo.2)  Re[1]: 異なる型制約のジェネリック メソッドを呼び出す方法?
□投稿者/ ひとやまいくら (1回)-(2014/08/14(Thu) 00:31:26)
ジェネリックどうこう関係なくinterface。
引用返信 編集キー/
■73054 / inTopicNo.3)  Re[1]: 異なる型制約のジェネリック メソッドを呼び出す方法?
□投稿者/ Azulean (336回)-(2014/08/14(Thu) 00:44:12)
No73049 (Tom さん) に返信
> C#でジェネリックを使った関数を作っているのですが、
> 次のように、あるジェネリック メソッドから
> 異なる型制約のジェネリック メソッドを呼び出す方法はあるでしょうか?

Hoge、または Fuga からの継承関係のある T をもらって、そのユーティリティメソッドは何をするのでしょうか?
Hoge の範囲、あるいは Fuga の範囲でしか振る舞いを定義できず、さらにそれらの型のインスタンスとの関わり(引数・戻り値)もないようですので安直に「以下でよいのでは?」と思ってしまいます。

void Func<T>(T piyo)
{
  if (piyo is Hoge) Utility.FunctionForHoge<Hoge>();
  else if (piyo is Fuga) Utility.FunctionForFuga<Fuga>();
  else ...
}

引数があるのであれば、as 演算子で Hoge/Fuga 型にキャストして引数に渡せばよいでしょう。
もう少し、具体例に近いサンプルコードを提示してもらった方がよいかと思われます。
引用返信 編集キー/
■73057 / inTopicNo.4)  Re[2]: 異なる型制約のジェネリック メソッドを呼び出す方法?
□投稿者/ Tom (2回)-(2014/08/14(Thu) 17:09:19)
2014/08/14(Thu) 17:10:00 編集(投稿者)

ひとやまいくら様、Azulean様ご回答ありがとうございますm(_ _)m
Azulean様のご回答が、まさに自分の求めていたものでした。
なるほど、Tをそのまま使わずに、<Hoge><Fuga>などを使ってキャストして渡せば十分ですね。
安直とおっしゃいますが、自分には完全に盲点でございました!(^^;

質問した甲斐がありました、どうもありがとうございました。
解決済み
引用返信 編集キー/
■73059 / inTopicNo.5)  Re[3]: 異なる型制約のジェネリック メソッドを呼び出す
□投稿者/ Azulean (337回)-(2014/08/14(Thu) 19:06:49)
2014/08/14(Thu) 19:09:17 編集(投稿者)

No73057 (Tom さん) に返信
> なるほど、Tをそのまま使わずに、<Hoge><Fuga>などを使ってキャストして渡せば十分ですね。
> 安直とおっしゃいますが、自分には完全に盲点でございました!(^^;

対象のメソッドが typeof(T) から何かするような処理が書かれている場合、私が書いた回避コードではまずい可能性はあります。
もっとも、static メソッドのようですし、static フィールドを持っていない限りは大丈夫だとは思いますが…。
(Console.WriteLine とか、決め打ちされた静的な出力に書き込むような振る舞いなら、大丈夫じゃないかも)

また、私が書いたように <Hoge>, <Fuga> 固定でよいなら、そもそもジェネリックである必要はないのかもしれません。
設計・実装者のミスでジェネリックになってしまっているだけなのか、それとも T に基づいてリフレクションを使った何かが埋め込まれているか、それは第三者にはわからないので判断がつきません。


// ちなみに「キャスト」ではないっす。オブジェクトを型変換しているわけではないため。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -