読み取るデータに応じて変数の型がある場合 (あなたの場合のように)、ジェネリックを使用しても意味がありません。@Spontifixus アプローチを採用しても、作成されたすべての要素を 1 つにまとめることができません。これはList<T>
、各オブジェクトで使用される異なるタイプが原因で、独自の各組み合わせに必要ですList<T>
。また、後でコードですべての引数を操作したい場合は、ジェネリック型ごとにクエリを実行して、現在のインスタンスから目的の値を読み取る方法を知る必要があります。
それでもジェネリック型が必要だと思われる場合 (この場合)、ジェネリック クラス、クリエーター メソッド、および通常のインターフェイスを使用することで解決できます。
public interface ICommand
{
int CommandCode { get; set; }
object Argument1 { get; }
object Argument2 { get; }
object Argument3 { get; }
}
public static class Command
{
public static Command<T1, T2, T3> Create<T1, T2, T3>(int code, T1 arg1, T2 arg2, T3 arg3)
{
return new Command<T1, T2, T3>(code, arg1, arg2, arg3);
}
}
public class Command<T1, T2, T3> : ICommand
{
public Command(int code, T1 arg1, T2 arg2, T3 arg3)
{
CommandCode = code;
Argument1 = arg1;
Argument2 = arg2;
Argument3 = arg3;
}
public int CommandCode { get; set; }
public T1 Argument1 { get; set; }
public T2 Argument2 { get; set; }
public T3 Argument3 { get; set; }
object ICommand.Argument1
{
get { return Argument1; }
}
object ICommand.Argument2
{
get { return Argument2; }
}
object ICommand.Argument3
{
get { return Argument3; }
}
}
このアプローチを使用すると、creator メソッドを呼び出すことで型推論を通じてインスタンスを作成し、それらすべてを 1 つのリストに入れることができます。
var commands = new List<ICommand>();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);
これで汎用オブジェクトが 1 つのリストにまとめられましたが、このリストをどのように操作するのでしょうか? 最後に、常にICommand
インターフェイスを使用して に固執しobject
、ジェネリックを役に立たなくしています。しかし、そうは思わないかもしれません。このアプローチが役立つかもしれません。