在 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;
    }
}