我有一个接受泛型类型的BaseViewModel的方法。 我想在方法中获得实际的对象。
我尝试了什么:
public static void LogScreen<T>() where T : BaseViewModel
{
var viewModel = T as BaseViewModel;
}
答案 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
并且您需要始终投射对象
另一方面,如果你有一个方法,你只有一种类型,那么使用严格的参数类型(第二种方法)更容易。
评论 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
。