返回T的对象实例的泛型方法

本文关键字:泛型方法 实例 对象 返回 | 更新日期: 2023-09-27 18:21:10

我有相同的类,但在不同的命名空间中。例如:x.InHeaderType、y.InHeaderType等…

我必须经常用相同的参数创建这些类的实例。

这是一个示例:

x.InHeaderType inHeader = new x.InHeaderType();
inHeader.CompanyId = "TEST";
inHeader.UserId = "TEST";
inHeader.Password = "TEST";
inHeader.MessageId = " ";

有可能创建一种方法,如:

    public static T GetInHeaderProperty<T>()
    {
        T value;
        // fill the properties of object and return the instance of T
        // I will call it when I need x.InHeaderType or y.InHeaderType
    }

提前感谢,

返回T的对象实例的泛型方法

您可以使用以下代码:

public static T GetInHeaderProperty<T>() where T : new()
{
    dynamic result = new T();
    result.CompanyId = "Test";
    result.UserId = "Test";
    result.Password = "Test";
    result.MessageId = " ";
    return (T)result;
}

这是托马斯·詹森答案的简化版本。它假设所有类型都有一个默认构造函数。

你可以这样称呼它:

var result = GetInHeaderProperty<x.InHeaderType>();

首先,为什么在两个不同的命名空间中有相同的类?

我会创建一些神奇的函数,比如:

public static T GetInHeaderProperty<T>(Func<T> createObjFunc)
{
    T result = createObjFunc();
    dynamic resultAsDynamic = result as dynamic;
    resultAsDynamic.CompanyId = "Test";
    resultAsDynamic.UserId = "Test";
    resultAsDynamic.Password = "Test";
    resultAsDynamic.MessageId = " ";
    return (T)result;
}

这可能有效,但我不确定我会推荐它。你的代码可能有其他类型的问题,迫使你做这样的事情,你应该首先解决。

UPDATE:我假设不能让对象继承相同的接口。如果他们可以,你绝对不应该使用上面的代码,如果可以,你应该使用下面的代码:

public static T GetInHeaderProperty<T>() where T : ISomeType, new()
{
    T result = new T();
    result.CompanyId = "Test";
    result.UserId = "Test";
    result.Password = "Test";
    result.MessageId = " ";
    return result;
}

是的,您必须定义一个具有要设置的属性的接口或基类,从中专门化您的特定类型,并使用泛型约束让编译器知道泛型类型参数具有这些属性。

更多信息:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

这段代码很有味道。拥有两个完全相同但位于不同名称空间中的类型不是一个好主意。你能把它们移到一个公共的共享库吗?

我看到你在使用服务参考。是否需要对每个端点进行引用?你能以某种方式重构你的引用以消除这种重复吗?

我认为您需要:

public interface IInHeaderType
{
 string CompanyId { get; set; }
 string UserId { get; set; }
 string Password { get; set; }
 string MessageId { get; set; }
}
public static T GetInHeaderProperty<T>() where T : IInHeaderType, new ()
{
        T value = new T();
        // fill the properties of object and return the instance of T
        // I will call it when I need x.InHeaderType or y.InHeaderType
}