采用该类型的类型和返回实例的通用方法?

时间:2015-09-01 00:23:11

标签: c# generics

我有一堆具有相同属性的模型 - greenPeople,bluePeople等。对于每一个,我都有一个控制器,在帖子中,我将他们的图片推送到某个服务器并创建一个描述条目。实际上,我的模型是GreenPeoplePicture,BluePeoplePicture等。

所以我有类似的东西:

GreenPeoplePicture greenPeoplePicture = new GreenPeoplePicture(); 
greenPeoplePicture.Name = "blah"
greenPeoplePIcture.Date = DateTime.UtcNow;

等。一旦填写完毕,我就会流式传输到远程服务器,然后保存" greenPeoplePicture"到GreenPeoplePictures表。我想为此编写一个通用方法。我无法绕过如何在不传递任何变量的情况下传递类型本身,因为我想这样做:

GreenPeoplePicture greenPeoplePicture = new GreenPeoplePicture(); 

在方法中,并且返回类型为GreenPeoplePicture。我相信这篇文章无异于#34;我无法编写代码,也无法理解泛型,"但我试过 - 至少告诉我它是否可能。 MSDN和tutorialspoint没什么帮助。

2 个答案:

答案 0 :(得分:2)

这样的东西?

public T MakeColourPerson<T>() where T : new() {
    return new T();
}

var myPerson = MakeColourPerson<GreenPeoplePicture>();

此外,如果GreenPeoplePictureBluePeoplePicture有任何共同点(例如,如果它们继承自ColourPeoplePicture,您可以更改其中的位置:

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

答案 1 :(得分:1)

对于泛型,您可以使用default(T)将变量初始化为默认值,也可以使用new T()创建实例。要使用new(),您应该通过添加new()的类型约束来缩小类型的特异性

public T Factory<T>() where T : new() {
    return new T();
}

    return default(T);

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