为额外信息创建通用类成员

时间:2011-09-10 02:37:35

标签: c# class generics member

我是C#的新手(这是我的第一个C#项目)。我对基础知识非常有信心,但是我开始遇到一些引发我无法解决的问题的事情,无论我谷歌有多少不同的方式。本网站回答了很多我的问题。 :]
所以,既然我找不到这个问题的答案,我决定自己发布。

也许这是一个每个人都非常了解的问题的基础,但我无法从MSDN阅读中找到答案。

它与C#Generics有关。我正在为视频游戏引擎编程,我在AI单元之间创建了一个简单的消息传递系统。 Message类包含sender,receiver,dispatchTime和extraInfo等成员。我想使用extraInfo成员作为Message类的一个有用的,灵活的添加,所以我希望它能够包含任何类型(一个int节点索引,一个双路径成本,一个来自XNA的相关Vector3位置,等等...)。我对此的研究向我指出了泛型的方向。

我想出了如何在列表中使用泛型,但我还没有读过关于如何声明和实现泛型成员的任何内容。只是一个成员,而不是一个集合。

我如何申报此会员,extraInfo?另外,当从另一个类访问它时,我希望能够输入:

    info = message.extraInfo;

..通过get属性检索额外信息。

如何在C#中完成?

4 个答案:

答案 0 :(得分:3)

您的邮件类看起来像这样

public class Message<T>
{
     public object Sender { get; set; }
     public object Receiver { get; set; }
     public T ExtraInfo { get; set; }
}

public static void Main()
{
     Message<double> doubleMessage = new Message<double>() { ExtraInfo = 4.0d };
     Message<string> stringMessage = new Message<string>() { ExtraInfo = "Hello World" };
}

答案 1 :(得分:1)

您可以将类的extraInfo成员声明为object。然后你可以在那里放任何你想要的东西。

答案 2 :(得分:1)

使用.NET 4.0,您可以创建ExtraInfo类型的dynamic属性。然后,您可以在其中存储任何内容,只要您在运行时正确访问它,您就可以了。

答案 3 :(得分:0)

您可以通过创建包含的ExtraInfoType对象来解决您的问题 对象以及隐式运算符透明地转换为各种对象类型。 ExtraInfoType对象还可以指示ExtraInfoType中存储的对象类型。

此实现的一个示例如下。

enum ExtraInfoKind
{
    Integer,
    Double
}

class ExtraInfoType
{
    object value;

    public object Value {
        get { return value; }
    }
    ExtraInfoKind kind;

    public ExtraInfoKind Kind {
        get { return kind; }
    }

    private ExtraInfoType(object o, ExtraInfoKind kind){
        this.value=o;
        this.kind=kind;
    }

    public static implicit operator int(ExtraInfoType o){
        if(o.kind!= ExtraInfoKind.Integer)
            throw new InvalidCastException();
        return (int)o.value;
    }
    public static implicit operator double(ExtraInfoType o){
        if(o.kind!= ExtraInfoKind.Double)
            throw new InvalidCastException();
        return (double)o.value;
    }
    public static implicit operator ExtraInfoType(int o){
        return new ExtraInfoType(o, ExtraInfoKind.Integer);
    }
    public static implicit operator ExtraInfoType(double o){
        return new ExtraInfoType(o, ExtraInfoKind.Double);
    }
}

 /* Example
class Program
{
    public static void Main(string[] args)
    {
        ExtraInfoType t=1;
        Console.WriteLine(t.Kind);
        int valueT=t;
        Console.WriteLine(t);
        Console.ReadLine();
    }
}
 */ 

您可以在extraInfo类型下声明ExtraInfoType。 请注意,此处不需要泛型。另请注意ExtraInfoType 只能存储一种对象,可以通过Kind属性确定。 如果对象被强制转换为错误的类型,则抛出InvalidCastException,如 可以在上面的隐式运算符中看到。