gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:23 25 4
gpt4 key购买 nike

所以对于两个不同的命名空间,我有一个类 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,但它没有给出任何错误消息,但我想确保允许输入和输出类型为不同的类型。

编辑:

我可能没有完全解释清楚。

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

最佳答案

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

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));
}

编辑:

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

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

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

  • 仅针对此特定场景的一次性函数和此类做法如果长期存在,可能会导致代码困惑。

关于c# - 一个泛型类型参数,返回类型不同的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com