通用方法,如何在不指定类型的情况下调用父方法

时间:2017-07-06 12:44:29

标签: c# asp.net

我有这个父类

public abstract class Parent
{
    public string Id { get; set; }

    public static T Find<T>(string id) where T : class, new()
    {
        /* logic here ..*/
    }
}

和这个孩子

public class Child : Parent
{
    public string Name { get; set; }
}

现在,可以从子类中调用Find()方法,如Child.Find<Child>(myId);

我需要更改内容,因此不必包含类似Child.Find(myId);

的类类型

修改

我想将此方法作为扩展,直接获取它而不将类定义为变量。通用类T应该是它的子类型。

4 个答案:

答案 0 :(得分:0)

你的意思是这样的:

public abstract class Parent
{
    public string Id { get; set; }

    public static Parent Find(string id)
    {
        /* logic here ..*/
    }
}

这样您就必须将输出强制转换为正确类型的派生类。例如:

if(Parent.Find("123") is Child child)
{
   child.Name = "TEST";
}

修改

隐藏继承的成员并定义一个新成员:

    public abstract class Parent
    {
        public string Id { get; set; }

        public static Parent Find(string id)
        {
            /* logic here ..*/
        }
    }

    public class Child : Parent
    {
        public string Name { get; set; }

        public new static Child Find(string id)
        {
            /* logic here */
        }
    }

答案 1 :(得分:0)

一种选择是将此方法添加到Child类:

public static Child Find(string id)
{
    return Parent.Find<Child>(id);
}

答案 2 :(得分:0)

我会做这样的事情:

public abstract class Parent<T> where T : class, new()
{
    public T Find(string id) 
    {
        return new T();
    }
}
public class Child  : Parent<Child>
{
    public void Test()
    {
        var child = base.Find ("");
    }
}

答案 3 :(得分:0)

这将是扩展方法方法:

public static class ExtensionMethods
{
    public static T Find<T>(this T source, string id) where T : class, new()
    {
        return new T();
    }
}

public class Child
{
    public void FindChild()
    {
        this.Find("");
    }
}