我有一个接受泛型类型的BaseViewModel的方法.我想获得方法中的实际对象.
我尝试了什么:
public static void LogScreen<T>() where T : BaseViewModel
{
var viewModel = T as BaseViewModel;
}
Run Code Online (Sandbox Code Playgroud)
您没有将任何对象传递给方法,只传递参数类型.
要正确应用值,您应该使用如下语法:
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任何地方使用,并且您需要始终强制转换对象
另一方面,如果你有一个方法,你只有一种类型,那么使用严格的参数类型(第二种方法)更容易.
评论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在此方法中引用它.