为额外信息创建泛型类成员
本文关键字:成员 泛型类 创建 额外信息 | 更新日期: 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,如可以在上面的隐式操作符中看到。