泛型方法接受一个类型并返回该类型的实例
本文关键字:类型 返回 实例 一个 泛型方法 | 更新日期: 2023-09-27 18:10:41
我有一堆具有相同属性的模型- greenPeople, bluePeople等。对于每一个,我都有一个控制器,在帖子中,我将它们的图片推送到某个服务器,并创建一个描述该条目的SQL条目。实际上,我的模特是GreenPeoplePicture、BluePeoplePicture等。
所以我有这样的东西:
GreenPeoplePicture greenPeoplePicture = new GreenPeoplePicture();
greenPeoplePicture.Name = "blah"
greenPeoplePIcture.Date = DateTime.UtcNow;
等。填写完后,我将数据流传输到远程服务器,然后将"greenPeoplePicture"保存到GreenPeoplePictures表中。我想为它写一个泛型方法。我不知道如何在不传递任何变量的情况下传递类型本身,因为我想这样做:
GreenPeoplePicture greenPeoplePicture = new GreenPeoplePicture();
,并且返回类型也为GreenPeoplePicture
。我确信这篇文章等同于"我不会编码,也不懂泛型",但我试过了——至少告诉我这是否可能。MSDN和教程点没有多大帮助。
像这样?
public T MakeColourPerson<T>() where T : new() {
return new T();
}
var myPerson = MakeColourPerson<GreenPeoplePicture>();
同样,如果GreenPeoplePicture
和BluePeoplePicture
有任何共同之处(例如,如果它们继承自ColourPeoplePicture
,您可以将where更改为:
where T : ColourPeoplePicture, new()
更精确
这将允许您在MakeColourPerson
public T MakeColourPerson<T>()
where T : ColourPeoplePicture, new()
{
var colourPerson = new T();
colourPerson.Name = "blah";
colourPerson.Date = DateTime.UtcNow;
return colourPerson;
}
假设ColourPeoplePicture
公开属性Name
和Date
对于泛型,您可以使用default(T)
将变量初始化为默认值,或者您可以使用new T()
创建实例。为了使用new()
,您应该通过添加new()
public T Factory<T>() where T : new() {
return new T();
}
或
return default(T);
如果你想处理每种类型的不同属性,那么泛型不能完全解决这个问题,你必须用反射来补充它来动态查找属性。