gpt4 book ai didi

c# - 返回具有动态选择类型的 List,同时转换为该类型 (C#)

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:22 24 4
gpt4 key购买 nike

已解决,解决方法见文末。


我有一个返回附件列表的方法。我有三种类型的附件,它们都扩展了一个名为 GenericAttachment 的类:

GenericAttachment
||
==> FormA_Attachment
==> FormB_Attachment
==> FormC_Attachment

我还有不同的表单类型,它们都扩展了一个名为 GenericForm 的类:

GenericForm
||
==> FormA
==> FormB
==> FormC

该方法必须采用 Type参数是 FormA、FormB 或 FormC,并返回适当类型的附件。

我先试过这个:

public static List<GenericAttachment> GetAllAttachmentsByFormID<T>(int sqlFormId, Type type) where T : GenericForm
{
//this returns e.g. FormA_Attachment based on FormA as the input
Type attachmentType = GetAttachmentTypeByFormType(type);

//Call a generic function (overload of this one)
//that returns all attachments and requires a specific type argument.
//Meanwhile, .Invoke()'s return type is just an `object`
var attachments = typeof(AttachmentManager)
.GetMethod("GetAllAttachmentsByFormID", new[] { typeof(int) }) // select the correct overload for the method
.MakeGenericMethod(attachmentType)
.Invoke(new AttachmentManager(), new object[] { sqlFormId });

return (List<GenericAttachment>)attachments;
}

但是,转换在运行时失败(“转换失败”)。

然后我用 if/else 语句尝试了一种更笨的方法,但它没有编译,因为“无法将 List<FormA_Attachment> 转换为 List<GenericAttachment>”。都尝试使用 Convert.ChangeType和正常类型转换,如下所示。

奇怪的是它没有编译,因为例如FormA_Attachment延伸GenericAttachment .

        if (attachmentType == typeof(FormA_Attachment))
{
return (List<FormA_Attachment>) Convert.ChangeType(attachments, typeof(List<FormA_Attachment>));
}
else if (attachmentType == typeof(FormB_Attachment))
{
return (List<FormB_Attachment>)attachments;
}
else if (attachmentType == typeof(FormC_Attachment))
{
return (List<FormC_Attachment>)attachments;
}
else
{
throw new Exception("Invalid attachment class type.");
}

如何转换 attachments进入List<type> , 其中type是动态选择的?


解决方案:

感谢@Mikhail Neofitov,以下代码有效。

attachments类型为 object因为这就是.Invoke()返回。

所以我首先将其转换为特定类型,然后使用 .OfType<GenericAttachment>().ToList() 转换为不太特定的类型.

        if (attachmentType == typeof(FormA_Attachment))
{
return ((List<FormA_Attachment>) Convert.ChangeType(attachments, typeof(List<FormA_Attachment>))).OfType<GenericAttachment>().ToList();
}
else if (attachmentType == typeof(FormB_Attachment))
...
//similar code

最佳答案

C# 不允许 types covariance , 这意味着 List<string>不能简单地转换为 List<object> .

在您的情况下,您可以使用 LINQ扩展方法 OfType() 如下:

return attachments.OfType<GenericAttachment>().ToList();

我想请注意,您可以修改您的应用程序架构以传递 GenericArgument 的结果类型到 GenericForm 的通用参数并定义一个抽象方法,用于在结果类型中返回结果附件。此外,您的通用参数 <T>没有用,你不要在方法体中使用它。

关于c# - 返回具有动态选择类型的 List<type>,同时转换为该类型 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42688079/

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