【问题标题】:Generic method cast T to object type泛型方法将 T 转换为对象类型
【发布时间】:2018-01-02 16:29:53
【问题描述】:

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

我尝试了什么:

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

【问题讨论】:

  • “实际对象”,你是什么意思?如果您需要对象的实例,请将其作为参数。 void LogScreen&lt;T&gt;(T instance) ...
  • 非常不清楚您在寻找什么,可能与new T() 重复? - stackoverflow.com/questions/11234452/…
  • 如果您需要在泛型函数中获取已定义类型的实例,那么您的想法或架构就有问题。即使您使用“where T”。您有此函数接受的基本类型,因此您应该改用“public static void LogScreen(BaseViewModel baseViewModel)”。

标签: c#


【解决方案1】:

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

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

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&lt;int&gt;)。如果您在没有泛型类型的情况下这样做,则需要在任何地方使用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 引用。

【讨论】:

  • var viewModel = TArg as BaseViewModel; 应该是 var viewModel = TArg;,因为 TArg 已经是 BaseViewModel 或派生自它。
  • @ZoharPeled 在 Q 中回复。
  • 好吧,尽管我喜欢用 bold 字体读取我的名字,但您的编辑是错误的。从编译器的角度来看,名为viewModel 的引用的类型与名为viewModel2 的引用的类型完全相同——两者都是BaseViewModel,并且这两个实例可能是也可能不是任何派生自BaseViewModel。长话短说,as 运算符在此代码中是多余的。即使您传递从BaseModelView 派生的某个类的实例,您也只能在此方法中将其作为BaseModelView 引用。
  • @ZoharPeled 好的,签入代码,我不得不道歉。这一天也不是没用的。谢谢!
  • 不需要道歉。我们俩都没有绝对的c#知识,我相信我可以向你学习,就像你能向我学习一样。我认为这就是这个社区的全部意义所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2013-05-23
相关资源
最近更新 更多