返回T的对象实例的通用方法

ani*_*lca 2 c# generics reflection

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

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

这是一个示例:

x.InHeaderType inHeader = new x.InHeaderType();

inHeader.CompanyId = "TEST";
inHeader.UserId = "TEST";
inHeader.Password = "TEST";
inHeader.MessageId = " ";
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个方法,如:

    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
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢,

Tom*_*son 8

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

我会创造一些神奇的功能,如:

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;
}
Run Code Online (Sandbox Code Playgroud)

这可能有用,但我不确定我会推荐它.您的代码可能会遇到其他类型的问题,迫使您执行此类应首先修复的问题.

更新:我假设您无法使对象继承相同的接口.如果他们可以,你绝对不应该使用上面的代码,如果可以,你应该使用下面的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 7

您可以使用以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是Tomas Jansson答案的简化版本。假定所有类型都有默认构造函数。

您可以这样称呼它:

var result = GetInHeaderProperty<x.InHeaderType>();
Run Code Online (Sandbox Code Playgroud)