If you have variable types depending on the data you read (like in your case) it doesn't make much sense to use generics. Even if you take @Spontifixus approach you are not able to put all the created elements in one List
, cause due to the different types used in each object you need for each combination your own List
. Also if you later in code like to work with all the arguments, you need to query for each generic type to know how to read the desired value out of the current instance.
Если вы все еще думаете, что вам нужны универсальные типы (в этом случае), можно помочь себе при помощи универсального класса метод создателя и нормальный интерфейс:
public interface ICommand
{
int CommandCode { get; set; }
object Argument1 { get; }
object Argument2 { get; }
object Argument3 { get; }
}
public static class Command
{
public static Command Create(int code, T1 arg1, T2 arg2, T3 arg3)
{
return new Command(code, arg1, arg2, arg3);
}
}
public class Command : 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; }
}
}
При помощи этого подхода можно создать случай через вывод типа, назвав метод создателя и поместить всех их в один список:
var commands = new List();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);
Теперь вы получили свои родовые объекты в одном списке, но как вы работаете с этим списком? Наконец вы идете все время, используя интерфейс ICommand
и придерживаетесь объекта
, делая непатентованные средства бесполезными. Но возможно вы не думаете так, и этот подход мог бы помочь.