转换为基类通用类

时间:2014-01-10 17:45:51

标签: c# generics casting

我的基本控制器如下:

public abstract class BaseController<T, VM> : Controller
        where VM : BaseViewModel
        where T : Entity
    {}

派生控制器如下:

public partial class HomeController : BaseController<Product,ProductViewModel>
    {
    }

在动作过滤器类中,     我想将homecontroller转换为基本控制器来访问basecontroller属性     这是行不通的。     或者是否有任何其他方法来使用反射获取基本控制器属性    任何人都可以判断是否可能?

public class DataUpdaterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                  **var controller = filterContext.Controller as BaseController;** 

        }    }

4 个答案:

答案 0 :(得分:1)

试试这个:

var controller = filterContext.Controller as BaseController<Entity, ViewModel>;

答案 1 :(得分:0)

您可以直接将其强制转换为基本控制器,而无需知道它是什么。你可以把它归结为实体......

答案 2 :(得分:0)

在C#中,给定类似SomeGenericType<T1,T2>的泛型类型,如果你有一个实例,请说

SomeGenericType<int,string> myInstance ;

或者它的子类型,比如说

class MyWidget : SomeGenericType<AbstractWidget,AbstractGadget> { ... }
....
MyWidget widgetInstance ;

在不知道所涉及的类型参数(T1T2)的详细信息的情况下,无法将实例向上转换为似乎继承的内容。在上面的示例中,虽然您可以将myInstance投射到SomeGenericType<int,string>widgetInstance投放到SomeGenericType<AbstractWidget,AbstractGadget>,但是无法将其中任何一个投射到SomeGenericType<?,?>

这是因为泛型类型的实例并不真正从通常意义上的基类泛型类型继承。

此外,给出类似

的内容
class A { ... }
class B : A { ... }

SomeGenericType<B> instance ;

你甚至不能像这样抬头instance

SomeGenericType<A> upcast = (SomeGenericType<A>) instance ;

很多时候我并不特别关心泛型类型参数的细节:我发现这在C#的设计上是一个巨大的失败,尽管我确信设计师有他们的理由。 / p>

答案 3 :(得分:0)

C#和CTS(通用类型系统)不允许转换为类似的开放泛型类型。如果BaseController<,>中的属性不依赖于类型参数,则有两个选项:创建非泛型接口IBaseController,在其中列出这些属性并使BaseController<,>实现这个接口,或者为BaseController<,>创建一个非泛型(可能是抽象的)基类,并将属性放入这个基类中。无论您是否需要转换为BaseController,这通常都是一个好主意。

顺便提一下,有时您还可以创建其类型取决于类型参数的非泛型版本的属性,例如:在您的情况下,IBaseController可以拥有属性Entity Entity {get;}