首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个类中的泛型和定义类型

一个类中的泛型和定义类型
EN

Stack Overflow用户
提问于 2013-01-09 12:38:23
回答 2查看 79关注 0票数 1

是否有可能在一个类中有泛型类型和非泛型类型?

我有一个类,我必须管理不同的类型,但我不知道我会得到什么,我想使用泛型,但我还没有找到一个方法来做到这一点。

这就是我想要做的

代码语言:javascript
运行
复制
int commandCode;
<T> arg1;
<T> arg2;
<T> arg3;

我必须从文本文件中读取4行字符串,并尝试将这些行解析为

  1. 整型
  2. 浮动
  3. 布尔值
  4. 把它当作字符串

(首先尝试将其解析为1,如果不可能解析为2,如果不可能解析为3,如果不可能解析为4)。

在知道每个参数的类型之后,用其各自的类型定义每个变量。

例如,与文本文件一起使用

  • commandCode=2
  • arg1=true
  • arg2=256
  • arg3=dont

我会有一个对象

  • int commandCode
  • < bool > arg1
  • < int > arg2
  • < string> arg3

arg1到arg3的任何组合都会发生这种情况。

EN

回答 2

Stack Overflow用户

发布于 2013-01-09 13:03:07

如果我正确地理解了您,您只能在运行时确定实际类型。在这种情况下,csae泛型对您帮助不大,因为任何类型的参数都需要在编译时解析,因此需要以某种方式使用反射。下面是一个工厂,可以扩展,以满足您的需要。您可能需要16个不同的方法,也可能不需要16个不同的方法,具体取决于您实际拥有多少个子类(使用下面的方法,每个子类都需要一个子类),您也可以跳过Create方法,直接选择适当的类/构造函数

代码语言:javascript
运行
复制
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){
            ....
       }
   }
}
票数 1
EN

Stack Overflow用户

发布于 2013-01-09 13:16:45

如果您的变量类型取决于您读取的数据(比如在您的示例中),那么使用泛型就没有多大意义。即使采用@Spontifixus方法,也无法将所有创建的元素放在一个List<T>中,因为每个对象中使用的类型不同,因此每个组合都需要自己的List<T>。此外,如果以后在代码中喜欢使用所有参数,则需要查询每个泛型类型,以了解如何从当前实例中读取所需的值。

如果仍然认为需要泛型类型(在本例中),可以通过使用泛型类、创建者方法和正常接口来帮助自己:

代码语言:javascript
运行
复制
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方法来通过类型推断创建一个实例,并将它们放在一个列表中:

代码语言:javascript
运行
复制
var commands = new List<ICommand>();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);

现在,您在一个列表中获得了通用对象,但是如何处理这个列表呢?最后,您将一直使用ICommand接口并坚持使用object,使泛型毫无用处。但也许你不这么认为,这种方法可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14235368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档