因此对于两个不同的命名空间,我有一个类Record。我想根据传入的类型返回适当的一个。为了尝试这样做,我尝试了这个,但是“T2”是不正确的。我怎样才能做到这一点?
public T2 GetGeneratedType<T1>(string name) where T1 : class where T2 : class
{
var type = typeof(T1);
var generatedName = type.AssemblyQualifiedName.Replace(type.Name, name);
return (T2)Activator.CreateInstance(Type.GetType(generatedName));
}
我没有测试过这个(显然不会编译),但是我如何使这个工作,如果我传入Namespace1.SomeClass,我得到Namespace1.Record,如果我传入Namespace2.SomeOtherClass ,我得到Namespace2.Record(只要name ==“Record”)。
我最初尝试使用T并且它没有提供任何错误消息,但我想确保允许输入和输出类型为不同的类型。
编辑:
我可能没有完全解释过。
我正在为分叉记录创建数据注释(从技术上讲,由于对它们执行了3个不同的进程,3个人需要能够在任何给定时间分配此记录。它们在3个进程之后进行协调完成)。因此,namespace1是一个项目(不是Visual Studio意义上的),而namespace2是另一个项目。在namespace1中,您有一个ImportedRecord1和namespace2 ImportedRecord2(两个单独的项目都具有单独的属性,但或多或少具有相同的用途)。 Namespace1和Namespace2都有一个与该特定命名空间的ImportedRecord相关的Record类型,然后它将分成不同类型的3个“子记录”(基本上是该项目的导入记录,但是有一个与3个进程之一相关的字段)。
答案 0 :(得分:4)
您只需要将第二种类型声明为通用方法签名的一部分。
public T2 GetGeneratedType<T1, T2>(string name) where T1 : class where T2 : class
{
var type = typeof(T1);
var generatedName = type.AssemblyQualifiedName.Replace(type.Name, name);
return (T2)Activator.CreateInstance(Type.GetType(generatedName));
}
修改强>
这与您的问题没有直接关系,但无论如何我都会抛出它。我不认为这个设计真的会给你任何代码减少或其他...
你不会像工厂那样将类与工厂分离,因为现在你返回一个object
类型,你将被迫在另一方投下。
在利用反射在运行时创建这些对象时,您也会失去轻微的表现。
对于这种特定情况而言,只需一次性功能,如果这些情况持续下去,可能会导致代码猖獗。
答案 1 :(得分:2)
您需要做的就是将返回类型设置为动态而不是T2。类型将在运行时确定。
答案 2 :(得分:1)
通用类型参数只能“进入”函数调用。函数有可能具有泛型返回值,但返回值的类型必须由调用者提供[当然,对于返回某些类类型T
的函数来说,它可能返回引用从T
派生的任何类型的实例,但调用者仍然会将返回值的类型视为T
。]在许多情况下,可以指定一个非特定的返回类型并且具有如果调用者知道或者可以更精确地确定类型,则调用者强制转换它,但这种方法有一些限制。例如,可以知道返回的对象将是满足独立约束IFoo
和IBar
的类型,但是可能返回的事物类型可能不共享任何也实现{{}}的共同超类型。 {1}}和IFoo
。没有很好的身份保留方法可以将这样的返回值传递给需要满足IBar
和IFoo
约束的方法,因为没有一种类型可以转换所有可能的值。< / p>
解决此限制的一种方法是让函数公开对象而不是将其返回给调用者,而是将其传递给调用者提供的对象中的泛型方法。例如,如果定义了一个接口:
IBar
如果实现interface IFooBarConsumer { PerformAction <T>(T thing) where T:IFoo,IBar; }
interface IFooBarFeeder { FeedItem(IFooBarConsumer theConsumer); }
的类具有它知道满足IFooBarFeeder
和IFoo
的对象,它可以将该对象传递给传入的IBar
,并且消费者反过来能够将其传递给同时具有IFooBarConsumer
和IFoo
约束的方法。必须为消费者提供代码而不是简单地从中接收对象可能会很尴尬,但它允许人们以类型安全的方式做一些本来不可能的事情。