我有相同的类,但在不同的命名空间中。例如: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
}
提前致谢,
答案 0 :(得分:7)
首先,为什么在两个不同的命名空间中有相同的类?
我会创造一些神奇的功能,如:
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;
}
这可能有用,但我不确定我会推荐它。您的代码可能会遇到其他类型的问题,迫使您执行此类应首先修复的问题。
更新:我假设您不能让对象继承相同的接口。如果他们可以,你绝对不应该使用上面的代码,如果他们可以,你应该使用下面的代码:
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;
}
答案 1 :(得分:6)
您可以使用以下代码:
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;
}
这是Tomas Jansson答案的简化版本。它假定所有类型都有默认构造函数。
您可以这样称呼它:
var result = GetInHeaderProperty<x.InHeaderType>();
答案 2 :(得分:2)
是的,您必须使用要设置的属性定义接口或基类,从中特定化您的特定类型,并使用通用约束让编译器知道泛型类型参数具有这些属性。 / p>
答案 3 :(得分:1)
这段代码闻起来。有两种类型完全相同但在不同的命名空间中并不是一个好主意。你能把它们移到一个共同的共享库吗?
我看到你正在使用服务引用。您是否需要引用每个端点?你能以某种方式重构你的引用来删除这个重复吗?
答案 4 :(得分:0)
我认为你需要:
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
}