通用方法将T转换为对象类型

时间:2018-01-02 07:24:08

标签: c#

我有一个接受泛型类型的BaseViewModel的方法。 我想在方法中获得实际的对象。

我尝试了什么:

public static void LogScreen<T>() where T : BaseViewModel
 {
    var viewModel = T as BaseViewModel;
 }

1 个答案:

答案 0 :(得分:6)

您没有将任何对象传递给方法,只有参数类型

要正确应用值,您应该使用如下语法:

public static void LogScreen<T>(T TArg)
    where T : BaseViewModel
{
    var viewModel = TArg; //not necessary: as BaseViewModel;
}

在这种代码中你真的不需要使用泛型,你可能会使用简化版本:

public static void LogScreen(BaseViewModel viewModel)
{
     //already got viewModel as correct type and checked during compile for types
}

注意:使用通用方法的一大优势是放置一些类型,然后使用整个类型的类型(很好的示例IEnumerable<int>)。如果您在没有泛型类型的情况下执行此操作,则需要在任何地方使用object并且您需要始终投射对象

  • Generic是有利的,因为你可以放任何东西。

另一方面,如果你有一个方法,你只有一种类型,那么使用严格的参数类型(第二种方法)更容易。

评论 ZoharPeled - 代码应写为:

public static void LogScreen<T>(T TArg)
    where T : BaseViewModel
{
    var viewModel = TArg as BaseViewModel;
    var viewModel2 = TArg;
}

从编译器的角度来看,名为viewModel的引用的类型与名为viewModel2的引用的类型完全相同 - 两者都是BaseViewModel,并且这两个实例可能是也可能不是BaseViewModel派生的任何类型。长话短说,as运算符在此代码中是多余的。即使您传递了从BaseModelView派生的某个类的实例,也只能在此方法中将其引用为BaseModelView