有没有办法在C#中的Python中完成classmethod的工作?

也就是说,一个静态函数将根据其使用的子类来获取Type对象作为(隐式)参数。

我大概想要的一个例子是

class Base:
    @classmethod
    def get(cls, id):
        print "Would instantiate a new %r with ID %d."%(cls, id)

class Puppy(Base):
    pass

class Kitten(Base):
    pass

p = Puppy.get(1)
k = Kitten.get(1)

预期的输出是
Would instantiate a new <class __main__.Puppy at 0x403533ec> with ID 1.
Would instantiate a new <class __main__.Kitten at 0x4035341c> with ID 1.

(same code on codepad here.)

最佳答案

原则上,您可以这样写:

class Base
{
    public static T Get<T>(int id)
        where T : Base, new()
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

然后,您可以编写var p = Base.Get<Puppy>(10)。或者,如果您感到受虐,则可以编写Puppy.Get<Puppy>(10)甚至Kitty.Get<Puppy>;)在所有情况下,您都必须显式而不是隐式地传递类型。

另外,这也可以:
class Base<T> where T : Base<T>, new()
{
    public static T Get(int id)
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

class Puppy : Base<Puppy>
{
}

class Kitten : Base<Kitten>
{
}

您仍然需要将类型传递回基类,这使您可以按预期方式编写Puppy.Get(10)

但是,当var p = new Puppy(10)既简洁又惯用时,还是有理由这样写吗?可能不会。

关于c# - 适用于C#的Python风格的类方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2058884/

10-11 19:29