Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将对象强制转换为作为参数传递的类型_C#_Types_Parameters_Casting - Fatal编程技术网

C# 如何将对象强制转换为作为参数传递的类型

C# 如何将对象强制转换为作为参数传递的类型,c#,types,parameters,casting,C#,Types,Parameters,Casting,接下来,我发现可以将类型传递给方法。在已向其传递类型的方法中,如何将对象转换为已传递的类型?复杂的是,classFoo继承自一个我无法更改的类 var x = FetchData(); Foo foo = new Foo(2, typeof(Gizmo)); // pass the Gizmo type foo.Execute(x); public class Foo : ThirdPartyLibrary.Operation { Type customtype;

接下来,我发现可以将类型传递给方法。在已向其传递类型的方法中,如何将对象转换为已传递的类型?复杂的是,class
Foo
继承自一个我无法更改的类

 var x = FetchData();
 Foo foo = new Foo(2, typeof(Gizmo));   // pass the Gizmo type
 foo.Execute(x);


public class Foo :  ThirdPartyLibrary.Operation
{
    Type customtype;


     public Foo(int i, Type passedtype)  : base()
     {
          this.customtype=passedtype;
     }

     public override void Execute(ThirdPartyLibrary.Node node)
     {
         var record = ( ??? ) node.GetData();     // cast node to the type of customtype
     }
}

如果我正确理解了你的问题,你可以用泛型来做。它看起来像这样(根据您的示例代码):

public类Foo:ThirdPartyLibrary.Operation
{
公共Foo(inti):base()
{
//希望你能用“我”做点有用的事。
}
公共覆盖无效执行(ThirdPartyLibrary.Node)
{
//我不能100%确定您要强制转换哪个对象,所以我在下面展示了这两种形式。如果不更改变量名,您显然无法同时执行这两种操作。
//如果要转换“数据”,请使用此选项。
var record=(T)node.GetData();
//如果要强制转换“节点”,请使用此选项。
var记录=((T)节点).GetData();
}
}
您可以这样使用它:

var x = FetchData();
Foo foo = new Foo<Gizmo>(2); 
foo.Execute(x);
var x=FetchData();
Foo-Foo=新的Foo(2);
foo.Execute(x);

customtype
不再是必需的,因为您可以从类中的任何位置使用
typeof(T)
访问
T
Type

。之后您想用
录制
做什么?也许你可以使用一个接口来转换到它?它可以用泛型来完成吗?节点正在转换为自定义数据类型。这样的转换将完全没有意义,因为您无法对结果执行任何操作。你想完成什么?您可能需要泛型。创建一个名为
IHasData
的接口,该接口具有
GetData()
方法,并让您的自定义数据类型实现它。然后将
节点
参数的类型更改为
IHasData
。瞧,给我一点时间来消化这些建议,因为这对我来说是新的。感谢他们。我的理解是OP正在尝试将
节点
转换为不同的类型,因此它将是
((T)node.).GetData()
。我相信您可能是正确的。答案已更新,以显示两种形式,以防万一。作为辅助:只有在编译时知道类型
Gizmo
时,此选项才有效。否则,仿制药根本没用。@HimBromBeere:没错。除非添加泛型约束,或者将其用作封闭泛型子类的抽象基类,否则此方法也不会真正为您提供对
record
的属性和方法的访问权限。另一种选择是简单地使用
动态
,但这会打开另一整罐蠕虫。
var x = FetchData();
Foo foo = new Foo<Gizmo>(2); 
foo.Execute(x);