如何解决创建<T>的通用列表
我想创建一个将创建通用对象列表的方法。可能吗?像这样:
public class Mtrl
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Aa { get; set; }
}
public class Trdr
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Address { get; set; }
public string AFM { get; set; }
public string Phone01 { get; set; }
public string Aa { get; set; }
}
然后使用通用类创建我的列表:
public class GenericClass<T>
{
public List<T> GetData<T>()
{
List<T> myList = new List<T>();
if (typeof(T) == typeof(Trdr))
{
myList.Add(new Trdr());//Error 1: cannot convert from Trdr to 'T'
}
if (typeof(T) == typeof(Mtrl))//Error 2: cannot convert from Mtrl to 'T'
{
myList.Add(new Mtrl());
}
return myList;
}
}
我的错误。我将尝试澄清更多。 Trdr,Mtrl等类将具有许多不同的属性。 Getdata方法将通过json从Web服务获取数据,我想创建一个对象列表并返回它 像这样:
public List<T> GetData<T>()
{
List<T> myList = new List<T>();
if (typeof(T) == typeof(Trdr))
{
for (int i = 0; i < 100; i++)//fetch data from web api in json format
{
Trdr NewObj = new Trdr();
NewObj.Aa = "...";
NewObj.AFM = "...";
myList.Add(NewObj);
}
}
if (typeof(T) == typeof(Mtrl))
{
for (int i = 0; i < 100; i++)
{
Mtrl NewObj = new Mtrl();
NewObj.Aa = "...";
NewObj.Name = "name ...";
myList.Add(NewObj);
}
}
return myList;
}
}
解决方法
我建议提取一个接口(甚至是一个基类):
//TODO: Since you have more than 2 classes,please check the common interface
public interface Idr {
string Id { get; set; }
string Name { get; set; }
string Code { get; set; }
string Aa { get; set; }
}
所有感兴趣的类别都可以实现:
public class Mtrl : Idr
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Aa { get; set; }
}
public class Trdr : Idr
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Aa { get; set; }
public string Address { get; set; }
public string AFM { get; set; }
public string Phone01 { get; set; }
}
现在您可以使用List<Idr>
集合;我们希望实现T
的类(Idr
)也具有无参数构造函数(new()
):
public class GenericClass<T> where T : Idr,new()
{
public List<T> GetData()
{
List<T> myList = new List<T>() {
new T();
};
return myList;
}
}
,
听起来像您正在尝试创建一个包含一些初始数据的新列表,并且您需要对许多不同的类型T
执行此操作。
如果Mtrl
和Trdr
没有什么共同之处,并且处理方式完全不同,请考虑简单地使用不同的方法来获取每种类型的列表:
GetDataMtrl(){
var result = new List<Mtrl>();
result.Add(new Mtrl());
return result;
} // etc
否则,您需要的是Type Constraints of Generic Parameters,它可以告诉编译器更多有关T
是什么的信息。更确切地说,T
的不同值必须具有共同点。例如,您可以
public List<T> GetData<T>() where T : new()
{
List<T> myList = new List<T>();
myList.Add(new T());
return myList;
}
要说,对于T
,必须做new T()
。然后,您可以说GetData<Trdr>()
来获得一个列表,其中包含一个空的Trdr
,因为您的代码似乎可以尝试这样做。
也许您需要在数据中设置一些默认值。我注意到这些类有很多共同的变量。然后,您可以考虑使用继承来指定这种共性:
public class Mtrl
{
public string Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Aa { get; set; }
}
public class Trdr : Mtrl
{
public string Address { get; set; }
public string AFM { get; set; }
public string Phone01 { get; set; }
}
然后编写通用代码,其中T
是Mtrl
类型或其后代类:
public List<T> GetData<T>() where T : Mtrl
{
List<T> myList = new List<T>();
T MtrlOrTrdr = new T();
MtrlOrTrdr.Id = "my-new-id-";
myList.Add(MtrlOrTrdr);
return myList;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。