一个类中的泛型和定义类型
本文关键字:泛型 定义 类型 一个 | 更新日期: 2023-09-27 17:51:09
是否有可能在一个类中拥有泛型类型和非泛型类型??
我有一个类,我必须管理不同的类型,但我不知道我将收到什么,我想使用泛型,但我还没有找到这样做的方法。
这就是我要做的
int commandCode;
<T> arg1;
<T> arg2;
<T> arg3;
我必须从文本文件中读取4个字符串行,并尝试将这些行解析为
- int
- 布尔
- 保留为字符串
(首先尝试解析为1,如果不可能解析为2,如果不可能解析为3,如果不可能解析为4)
在知道每个参数的类型之后,用其各自的类型定义每个变量
例如,文本文件
- commandCode = 2
- __arg1 = true
- 最长= 256
- 长度=不
- int commandCode
- & lt;bool> arg1
- & lt;int> arg2
- & lt;字符串>长度
对于arg1到arg3的任何组合都是如此
如果我理解正确的话,您只能在运行时确定实际类型。在这种情况下,泛型不会帮助你太多,因为任何类型参数都需要在编译时解决,因此你需要以某种方式使用反射。下面是一个工厂,可以扩展以支持您的需求。您可能需要或不需要16种不同的方法,这取决于您实际拥有多少子类(使用下面的方法,每个子类都需要一个方法)。您也可以跳过Create方法,直接选择适当的类/构造函数
public class Command {
public static Command Create(string[] textLines) {
var args = textLines.Select(l => parseLine(l));
var argTypes = args.Select(a => a.GetType().ToArray();
return (Command)typeof(Command).GetMethod("Create",argTypes).Invoke(null,args);
}
public static Command Create(int commandType,
bool IsSponk,
int count,
string description){
return new CommandType1(commandType,
IsSponk,
count,
description);
}
private class CommandType1 : Command {
public CommandType1(int commandType, bool IsSponk, int count, string description){
....
}
}
}
如果根据所读取的数据有变量类型(就像您的情况一样),那么使用泛型就没有多大意义。即使您采用@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; }
}
}
通过使用这种方法,您可以通过调用创建者方法的类型推断来创建实例,并将所有实例放在一个列表中:
var commands = new List<ICommand>();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);
现在你在一个列表中得到了你的泛型对象,但是你如何使用这个列表呢?最后,您将一直使用ICommand
接口并坚持使用object
,从而使泛型无用。但也许你不这么认为,这个方法可能会有所帮助。