gpt4 book ai didi

C#:如何声明和使用具有不同类型的泛型类列表?

转载 作者:IT王子 更新时间:2023-10-29 04:19:12 27 4
gpt4 key购买 nike

具有以下通用类,其中包含 string, int, float, long 作为类型:

public class MyData<T>
{
private T _data;

public MyData (T value)
{
_data = value;
}

public T Data { get { return _data; } }
}

我正在尝试获取 MyData<T> 的列表 其中每个项目都是不同的 T .

我希望能够访问列表中的项目并获取其值,如下面的代码所示:

MyData<> myData = _myList[0];    // Could be <string>, <int>, ...
SomeMethod (myData.Data);

哪里 SomeMethod() 声明如下:

public void SomeMethod (string value);
public void SomeMethod (int value);
public void SomeMethod (float value);

更新:

SomeMethod() 来 self 无法控制的另一层级并且 SomeMethod(object) 不存在。


但是,我似乎找不到让编译器满意的方法。

有什么建议吗?

谢谢。

最佳答案

我认为您遇到的问题是因为您正在尝试创建通用类型,然后创建该通用类型的列表。您可以通过外包您尝试支持的数据类型(例如 IData 元素)来完成您尝试做的事情,然后创建具有 IData 约束的 MyData 泛型。这样做的缺点是您必须创建自己的数据类型来表示您正在使用的所有原始数据类型(string、int、float、long)。它可能看起来像这样:

public class MyData<T, C>
where T : IData<C>
{
public T Data { get; private set; }

public MyData (T value)
{
Data = value;
}
}

public interface IData<T>
{
T Data { get; set; }
void SomeMethod();
}

//you'll need one of these for each data type you wish to support
public class MyString: IData<string>
{
public MyString(String value)
{
Data = value;
}

public void SomeMethod()
{
//code here that uses _data...
Console.WriteLine(Data);
}

public string Data { get; set; }
}

然后你的实现会是这样的:

var myData = new MyData<MyString, string>(new MyString("new string"));    
// Could be MyString, MyInt, ...
myData.Data.SomeMethod();

需要多做一些工作,但您可以获得想要的功能。

更新:从您的界面中删除 SomeMethod 并执行此操作

SomeMethod(myData.Data.Data);

关于C#:如何声明和使用具有不同类型的泛型类列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com