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

Len*_*nie 0 c#

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

我尝试了什么:

public static void LogScreen<T>() where T : BaseViewModel
 {
    var viewModel = T as BaseViewModel;
 }
Run Code Online (Sandbox Code Playgroud)

Tat*_*ved 6

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

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

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

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

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

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

  • Generic在那里是有利的,因为你可以把任何东西放进去.

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


评论ZoharPeled - 代码应写成:

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

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