如果您的变量类型取决于您读取的数据(例如在您的情况下),那么使用泛型没有多大意义。即使您采用@Spontifixus 方法,您也无法将所有创建的元素放在一个中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 方法通过类型推断创建一个实例,并将它们全部放在一个列表中:
var commands = new List<ICommand>();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);
现在您将通用对象放在一个列表中,但是如何使用此列表?最后,您将一直使用ICommand
接口并坚持使用object
,从而使泛型变得无用。但也许你不这么认为,这种方法可能会有所帮助。