gpt4 book ai didi

c# - 如何在不在 C# 中定义泛型类型的情况下将方法参数转换为泛型

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

首先,以下问题与我正在编写的 Xamarin 应用程序有关,但我认为这是因为 C# 而不是因为底层 Java,如果是因为 Java 那么请告诉我,以便我可以更正问题标题

我希望创建一个抽象类,我将使用它作为我的项目将使用的所有 Fragment 类的基础。所以我这样定义它:

public abstract class CoreFragment<T> : Fragment

类中的 T 表示一个接口(interface),该接口(interface)必须由该 Fragment 附加到的任何类实现,因此例如我的代码是:

private T _parent;

public override void OnAttach(Activity activity){
if (activity is T){
_parent = activity as T;
} else { throw new Exception("Incorrect type of parent")' }
}

因此,当我创建一个新片段时,该片段应仅附加到实现接口(interface) iMainInteractions 的类型,我将其创建为:

public class MyNewFragment : CoreFragment<iMainInteractions>

我的问题是上面的代码:

_parent = activity as T;

不编译,我什至试过了:

_parent = (T) activity;

因为它有时似乎在“as”不起作用的地方工作,并且它不断抛出一个编译器错误,即 T 未指定为特定类型(我假设它希望我按照 where T 定义一些东西: 东西)

如果我删除它并使用类似的东西:

 _parent = (T) Convert.ChangeType(activity, typeof(T));

它会编译,到时候它会进入语句的真实部分,但是当 ChangeType 尝试执行时,它会抛出一个异常,说明事件没有实现 IConvertible

所以除了创建一个空白的 iInteraction 界面作为 T 的父界面,并让我所有的交互界面都遵循这个界面之外,还有什么方法可以让它工作吗?

在此先感谢您提供的任何帮助

最佳答案

您缺少 class 约束:

public abstract class CoreFragment<T> : Fragment where T : class

问题是 as 运算符仅适用于引用类型,因此它可以安全地生成 null 以防转换无效。在 T 不受约束的情况下,编译器无法判断它将被替换为引用类型还是值类型,因此 as 无法对其进行操作。

我不知道您的类层次结构是什么,但我会考虑引入一个可用作类型约束的基接口(interface)或类。例如,如果所有类似 Activity 的类都必须实现一个基接口(interface),例如 IActivityBase:

public abstract class CoreFragment<T> : Fragment where T : IActivityBase

这样的接口(interface)实际上不需要包含任何成员,并且可以仅用于在使用泛型类时提高类型安全性的目的。

关于c# - 如何在不在 C# 中定义泛型类型的情况下将方法参数转换为泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37628379/

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