【问题标题】:c# Array generics with each array item of different typec# 数组泛型,每个数组项具有不同类型
【发布时间】:2014-12-26 18:47:51
【问题描述】:

我有一个结构定义了一些使用泛型的对类型:

struct SomeNameValuePair<T>
{
    string TypeName;
    T Value;
}

并且需要声明一个 SomeNameValuePair 数组:

SomeNameValuePair<T>[] someNameValuePair=new SomeNameValuePair<T>[3];

问题是对于不同的数组项,我需要不同类型的 Value 属性。 在代码中更容易理解:

SomeNameValuePair<int> tempSomeNameValuePair0;

tempSomeNameValuePair0.TypeName="int";
tempSomeNameValuePair0.Value=10;


SomeNameValuePair<double> tempSomeNameValuePair1;

tempSomeNameValuePair1.TypeName="double";
tempSomeNameValuePair1.Value=10.5;

tempSomeNameValuePair2.TypeName="string";
tempSomeNameValuePair2.Value="Random String";

someNameValuePair[0]=tempSomeNameValuePair0
someNameValuePair[1]=tempSomeNameValuePair1
someNameValuePair[2]=tempSomeNameValuePair2

显然我的代码在实例化数组 someNameValuePair=new SomeNameValuePair&lt;T&gt;[3]; 时不起作用,我将其项目的数组属性 Value 提交为 T 类型。

有什么方法可以在 C# 中实现我的目标?

【问题讨论】:

  • 请重新检查您的代码。您是缺少括号还是只有我一个人?
  • 在您的实际项目中,您是否使用与示例中相同的类型?我只是在考虑一个通用的基类。如果您使用具有共同祖先的类,则可以将其用于此类通用集合。否则我会使用object
  • @DmitryPopov 不,上面的类型只是为了示例。我需要这样做的原因是在某些情况下类型在编译时是未知的。
  • @geraldCelente 泛型更像是编译时。见stackoverflow.com/questions/12708090/…
  • “我将其项目的数组属性值提交为 T 类型”——这甚至没有意义。没有“T型”。那只是一个占位符。你想使用你的类型的方式,它甚至不应该是通用的;只需输入Value 的类型object。如果您要展示一个合理的代码示例,说明为什么您认为将所有这些不相关的对象放入同一个数组中是有意义的,那么也许可以提供一个有用的答案。否则,只是不清楚您要做什么。

标签: c# arrays generics collections


【解决方案1】:

你需要一个非泛型基类:

class SomeNameValuePairBase
{
    string TypeName;
}

那么你所有的通用项目都继承自这个基类: (它的类,不是结构,因为结构不能使用继承)

class SomeNameValuePair<T> : SomeNameValuePairBase
{
    T Value;
}

这允许您声明一个项目数组:

SomeNameValuePairBase[] someNameValuePair = new SomeNameValuePairBase[3];

并像这样使用它:

someNameValuePair[0] = new SomeNewValuePair<double>();

此外,您不应使用“TypeName”,而应使用 C# 的“is”运算符:

if(someValuePair[0] is someValuePair<double>) ...

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多