为额外信息创建泛型类成员

本文关键字:成员 泛型类 创建 额外信息 | 更新日期: 2023-09-27 18:08:24

我对c#非常陌生(这是我的第一个c#项目)。我对基础知识相当有信心,但我开始遇到一些问题,不管我用多少种不同的方法搜索,我都无法完全解决。很多我的问题已经回答了这个网站。:]
所以,既然我找不到这个问题的答案,我决定自己贴出来。

也许这是一个太基本的问题,每个人都知道它,但我无法从MSDN阅读中找出这个问题。

它与c#泛型有关。我正在为一个电子游戏引擎编程,我已经在AI单位之间创建了一个简单的信息系统。Message类包含像sender、receiver、dispatchTime和extraInfo这样的成员。我想使用extraInfo成员作为Message类的一个有用的,灵活的添加,所以我希望它能够包含任何类型(int节点索引,双路径成本,来自XNA的相关Vector3位置,等等……)。我对此的研究将我指向了泛型的方向。

我知道如何在List之类的东西中使用泛型,但我还没有读到任何关于如何声明和实现泛型-member-的内容。只有单个成员,而不是集合。

如何声明这个成员extraInfo?此外,当从另一个类访问它时,我希望能够键入:

    info = message.extraInfo;

. .通过get属性获取额外的信息。

如何在c#中完成?

为额外信息创建泛型类成员

您的消息类看起来像这样

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" };
}

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

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

您可以通过创建包含一个的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();
    }
}
 */ 

在这里,您将在ExtraInfoType类型下声明extraInfo。注意,这里不需要泛型。还要注意ExtraInfoType只能存储一种对象,这可以由kind属性决定。如果对象被强制转换为错误的类型,则抛出InvalidCastException,如可以在上面的隐式操作符中看到。