使用单个方法返回可能的不同实例类型

时间:2017-11-21 20:29:06

标签: c# instance

所以我有两个实例类型“FirstType”和“SecondType”继承自母类“ContaBancaria”。它们都返回来自不同文本框的文本。基本上,他们做同样的事情,但我需要2个不同列表类型的实例(我可能不认为列表与我的问题有任何关系,所以我将继续不详细介绍)

以下是实例:

    private FirstType AddTypeFirst()
    {
        return new FirstType(textBoxNumber.Text,
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
    }

    private SecondType AddTypeSecond()
    {
       return new SecondType(textBoxNumber.Text,
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
    }

有没有办法用相同的方法类型返回这两个实例?

编辑: 我的意思是用一种方法返回这两种不同类型的实例,例如:

private [type?] AddInstance()
{
   return new [type*] textBoxNumber.Text,  //* the type could be FirstType or SecondType
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
}

编辑2:

ContaBancaria看起来像这样:

abstract class ContaBancaria
{
    public string number { get; set; }
    public string balance { get; set; }

    public Client data { get; set; }
}

并且,因为有客户......

class Client
{
    public string name;
    public string address;
    public string birth;
}

希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用泛型方法和开发类。 例如,您有两个类,并且您希望接收其中一个类。这些课程名为" FirstSon"和" SecondSon"他们俩都来自班级"父亲"。

class Father
{
    string myName;
    public string MyName
    {
        get { return myName; }
        set { myName = value; }
    }
    public Father()
    {
        myName = "John";
    }
}

class FirstSon : Father
{
    string mySecondName;
    public string MySecondName
    {
        get { return mySecondName; }
        set { mySecondName = value; }
    }

    public FirstSon()
    {
        mySecondName = "Bill";
    }
}

class SecondSon : Father
{
    int age;
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    string mySecondName;
    public string MySecondName
    {
        get { return mySecondName; }
        set { mySecondName = value; }
    }
    public SecondSon()
    {
        mySecondName = "Drake";
        age = 21;
    }
}

你有方法GetObject()。这种方法是通用的。它接收类的类型,然后检查它接收的类型并返回相同类型的新对象。

    public static T GetObject<T>() where T: Father
    {
        var firstSon = new FirstSon();
        var secondSon = new SecondSon();
        if (firstSon.GetType() == typeof(T))
            return (T)Convert.ChangeType(firstSon, typeof(T));
        return (T)Convert.ChangeType(secondSon, typeof(T));
    }

它使用方法Convert.ChangeType(对象值,类型转换类型),并允许您将对象转换为您的类型。

但根据How do I make the return type of a method generic?

,我不相信这是个好主意

答案 1 :(得分:-2)

假设您想根据要添加的列表返回正确的类型,您需要编写自己的通用添加函数,并使用Reflection来确定类型:

public static class Ext {
    public static void AddInstancia<T>(this List<T> aList) where T : class {
        if (typeof(T) == typeof(FirstType))
            aList.Add(AddTypeFirst() as T);
        else
            aList.Add(AddTypeSecond() as T);
    }
}

我认为没有理由这样做 - 毕竟,你知道列表的类型,只需为该列表调用正确的函数......

如果您为每个子类型添加一些函数,您也可以使用dynamic而不是使用Reflection:

public class FirstType : Parent {
    public FirstType MakeChild() {
        return new FirstType();
    }
}

public class SecondType : Parent {
    public SecondType MakeChild() {
        return new SecondType();
    }
}

public static class Static<T> where T : new() {
    public static dynamic Value = new T();
}

public static class Ext {
    public static void AddInstance<T>(this List<T> aList) where T : new() {
        aList.Add(Static<T>.Value.MakeChild());
    }
}

您可以调用

var list1 = new List<FirstType>();

list1.AddInstance();