我是C#的新手(这是我的第一个C#项目)。我对基础知识非常有信心,但是我开始遇到一些引发我无法解决的问题的事情,无论我谷歌有多少不同的方式。本网站回答了很多我的问题。 :]
所以,既然我找不到这个问题的答案,我决定自己发布。
也许这是一个每个人都非常了解的问题的基础,但我无法从MSDN阅读中找到答案。
它与C#Generics有关。我正在为视频游戏引擎编程,我在AI单元之间创建了一个简单的消息传递系统。 Message类包含sender,receiver,dispatchTime和extraInfo等成员。我想使用extraInfo成员作为Message类的一个有用的,灵活的添加,所以我希望它能够包含任何类型(一个int节点索引,一个双路径成本,一个来自XNA的相关Vector3位置,等等...)。我对此的研究向我指出了泛型的方向。
我想出了如何在列表中使用泛型,但我还没有读过关于如何声明和实现泛型成员的任何内容。只是一个成员,而不是一个集合。
我如何申报此会员,extraInfo?另外,当从另一个类访问它时,我希望能够输入:
info = message.extraInfo;
..通过get属性检索额外信息。
如何在C#中完成?
答案 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,如
可以在上面的隐式运算符中看到。