泛型方法接受一个类型并返回该类型的实例

本文关键字:类型 返回 实例 一个 泛型方法 | 更新日期: 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>();

同样,如果GreenPeoplePictureBluePeoplePicture有任何共同之处(例如,如果它们继承自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公开属性NameDate

对于泛型,您可以使用default(T)将变量初始化为默认值,或者您可以使用new T()创建实例。为了使用new(),您应该通过添加new()

的类型约束来缩小类型的专用性。
public T Factory<T>() where T : new() {
    return new T();
}

    return default(T);

如果你想处理每种类型的不同属性,那么泛型不能完全解决这个问题,你必须用反射来补充它来动态查找属性。