在 C# 中链接方法时如何进行转换
How to cast when chaining methods in C#
我正在尝试编写一些代码,而且我总是 return 对象本身,这样我就可以继续链接。像这样
object.SetThis().SetThat().SetThisThirdThing().setThisFourthThing();
我return在我所有的方法中都这样做,所以我可以继续这样做。但是我的方法之一是我在我的基地 class 中制作的东西,当然 return 就是基地 class。
所以 public MyClass SetThat()
它 return 是 public SuperClass SetThat()
。因为它 returns SuperClass
而不是 MyClass
我不能调用 SetThisThirdThing()
因为基础 class 不知道它。
那么我该如何施放它才能保留链条?语法是什么?我试过了
object.SetThis().(MyClass)SetThat().SetThisThirdThing().setThisFourthThing();
或者有没有一种方法可以在从子class调用时使超类方法return成为子class,而不必在所有子[=29=中重写它]es?
这是所有子classes 的共同点之一,所以如果我能够以某种方式绕过它而不必在我的所有子[中重写它,那就太好了=29=]es.
var obj = ((MyType)myObject.SetThis()).SetThat();
P.S 你应该避免这样做,因为它会变得非常混乱。
只需使用括号:
(MyClass)(object.SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
我不知道为什么 object
在那里,但你可以安全地删除它。
(MyClass)(SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
这样试试:
((MyClass)object.SetThis().SetThat()).SetThisThirdThing()
is there a way to make a superClass method return the subclass when called from the subclass without having to override it in all the subclasses?
你能使超类泛化吗?
public class SuperClass<T> where T: SuperClass<T>
{
public T SetThis()
{
....
return (T)this;
}
}
public class SubClass : SuperClass<SubClass>
{
}
请注意,这不是 100% 有保证的,因为您也可以这样做:
public class EvilSubClass : SuperClass<SubClass>
{
}
符合通用约束,但现在 SetThis()
的 return 类型是 SubClass
而不是 EvilSubClass
要转换(子)表达式,您需要将 class 名称放在前面(并使用括号)。
((MyClass)obj.SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
(注意object
是保留字,不能作为变量名使用)
另一种方法是使用 as
关键字:
(obj.SetThis().setThat() as MyClass).SetThisThirdThing().setThisFourthThing();
请注意,如果 setThat()
不是 return 和 MyClass
,这将有不同的表现;
第一个版本将抛出 InvalidCastException
,第二个版本将抛出 NullReferenceException
,因为如果无法进行强制转换,则 as
returns null
。
在不修改你的类的情况下,你也可以像这样写一个扩展方法As
public static T As<T>(this MyBaseClass obj) where T : MyBaseClass
{
return (T)obj;
}
--
用法与此类似
new MyChildClass().SetBase().As<MyChildClass>().SetThis();
为什么不这样做呢?一个简单的 Cast
方法可以帮助您将其转换回正确的类型...
class Program
{
static void Main(string[] args)
{
var obj = new MyClass();
//obj.SetThis().SetThat().SetThisThirdThing().setThisFourthThing(); // Compile error
obj.SetThis().SetThat().Cast<MyClass>().SetThisThirdThing().setThisFourthThing();
}
}
class SuperClass
{
public SuperClass SetThat()
{
return this;
}
public T Cast<T>() where T : SuperClass
{
return (T)this;
}
}
class MyClass : SuperClass
{
public MyClass SetThis()
{
return this;
}
public MyClass SetThisThirdThing()
{
return this;
}
public MyClass setThisFourthThing()
{
return this;
}
}
我正在尝试编写一些代码,而且我总是 return 对象本身,这样我就可以继续链接。像这样
object.SetThis().SetThat().SetThisThirdThing().setThisFourthThing();
我return在我所有的方法中都这样做,所以我可以继续这样做。但是我的方法之一是我在我的基地 class 中制作的东西,当然 return 就是基地 class。
所以 public MyClass SetThat()
它 return 是 public SuperClass SetThat()
。因为它 returns SuperClass
而不是 MyClass
我不能调用 SetThisThirdThing()
因为基础 class 不知道它。
那么我该如何施放它才能保留链条?语法是什么?我试过了
object.SetThis().(MyClass)SetThat().SetThisThirdThing().setThisFourthThing();
或者有没有一种方法可以在从子class调用时使超类方法return成为子class,而不必在所有子[=29=中重写它]es?
这是所有子classes 的共同点之一,所以如果我能够以某种方式绕过它而不必在我的所有子[中重写它,那就太好了=29=]es.
var obj = ((MyType)myObject.SetThis()).SetThat();
P.S 你应该避免这样做,因为它会变得非常混乱。
只需使用括号:
(MyClass)(object.SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
我不知道为什么 object
在那里,但你可以安全地删除它。
(MyClass)(SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
这样试试:
((MyClass)object.SetThis().SetThat()).SetThisThirdThing()
is there a way to make a superClass method return the subclass when called from the subclass without having to override it in all the subclasses?
你能使超类泛化吗?
public class SuperClass<T> where T: SuperClass<T>
{
public T SetThis()
{
....
return (T)this;
}
}
public class SubClass : SuperClass<SubClass>
{
}
请注意,这不是 100% 有保证的,因为您也可以这样做:
public class EvilSubClass : SuperClass<SubClass>
{
}
符合通用约束,但现在 SetThis()
的 return 类型是 SubClass
而不是 EvilSubClass
要转换(子)表达式,您需要将 class 名称放在前面(并使用括号)。
((MyClass)obj.SetThis().SetThat()).SetThisThirdThing().setThisFourthThing();
(注意object
是保留字,不能作为变量名使用)
另一种方法是使用 as
关键字:
(obj.SetThis().setThat() as MyClass).SetThisThirdThing().setThisFourthThing();
请注意,如果 setThat()
不是 return 和 MyClass
,这将有不同的表现;
第一个版本将抛出 InvalidCastException
,第二个版本将抛出 NullReferenceException
,因为如果无法进行强制转换,则 as
returns null
。
在不修改你的类的情况下,你也可以像这样写一个扩展方法As
public static T As<T>(this MyBaseClass obj) where T : MyBaseClass
{
return (T)obj;
}
--
用法与此类似
new MyChildClass().SetBase().As<MyChildClass>().SetThis();
为什么不这样做呢?一个简单的 Cast
方法可以帮助您将其转换回正确的类型...
class Program
{
static void Main(string[] args)
{
var obj = new MyClass();
//obj.SetThis().SetThat().SetThisThirdThing().setThisFourthThing(); // Compile error
obj.SetThis().SetThat().Cast<MyClass>().SetThisThirdThing().setThisFourthThing();
}
}
class SuperClass
{
public SuperClass SetThat()
{
return this;
}
public T Cast<T>() where T : SuperClass
{
return (T)this;
}
}
class MyClass : SuperClass
{
public MyClass SetThis()
{
return this;
}
public MyClass SetThisThirdThing()
{
return this;
}
public MyClass setThisFourthThing()
{
return this;
}
}