一个泛型类型参数,返回类型的泛型不同?

Rob*_*ert 1 c# generics

所以对于两个不同的命名空间,我有一个类 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));
}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过这个(显然不会编译),但是我如何进行这项工作,以便如果我传入 Namespace1.SomeClass,我得到 Namespace1.Record,如果我传入 Namespace2.SomeOtherClass,我得到Namespace2.Record(只要名称==“记录”)。

我最初尝试使用 T 进行所有操作,但它没有给出任何错误消息,但我想确保允许输入和输出类型为不同类型。

编辑:

我可能没有完全解释。

我正在为分叉记录创建数据注释(从技术上讲,由于对他们执行了 3 个不同的进程,因此需要能够在任何给定时间为 3 个人分配此记录。一旦 3 个进程完成,他们就会进行协调) . 因此,namespace1 是一个项目(不是在 Visual Studio 意义上),namespace2 是另一个项目。在 namespace1 你有一个 ImportedRecord1 和在 namespace2 ImportedRecord2(这两个项目都有不同的属性,但或多或​​少有相同的目的)。Namespace1 和 Namespace2 都具有与该特定命名空间的 ImportedRecord 相关的 Record 类型,然后将分叉到不同类型的 3 个“子记录”(基本上是该项目的导入记录,但具有与 3 个进程之一相关的字段) )。

Fei*_*ngo 5

您只需要将第二种类型声明为泛型方法签名的一部分。

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

编辑:

这与您的问题并没有直接关系,但无论如何我都会提出来。我不认为这个设计真的给你任何价值代码减少或其他......

  • 您不会像使用工厂那样将类解耦,因为现在您返回一个object类型,您将被迫在另一侧强制转换。

  • 在运行时利用反射创建这些对象时,您也会损失轻微的性能。

  • 只是针对这种特定场景的一次性功能和此类实践,如果长期存在,可能会导致代码混乱。