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

时间:2016-06-04 09:00:43

标签: c# generics

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

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

public abstract class CoreFragment<T> : Fragment

类中的T表示必须由此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")' }
}

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

public class MyNewFragment : CoreFragment<iMainInteractions>

我的问题是上面的代码:

_parent = activity as T;

不编译,我甚至尝试过:

_parent = (T) activity;

因为它有时看起来像'as'那样工作,并且它不断抛出一个编译器错误,T没有被指定为特定类型(我假设它希望我在T的位置定义某些东西) :某事)

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

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

它将编译,当时间到来时它将进入语句的真实部分但是当ChangeType尝试执行时,它将抛出一个异常,表示该活动没有实现IConvertible

所以除了创建一个空白的iInteraction接口作为T的父级,并且让我的所有交互接口都遵循这个,有没有办法让这个工作?

提前感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:1)

您缺少class约束:

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

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

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

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

此类界面实际上不需要包含任何成员,并且只能在使用泛型类时提高类型安全性。