转换类型

时间:2010-03-24 13:30:43

标签: c# type-conversion

我有以下问题。
我有一个班级“Instellingen”,这是其他3个班级的一个领域

    public class Instellingen
    {
        private int _ID;
    }
    public class Class1: Button
    {
        private Instellingen _Instellingen;
    }
    public class Class2 : Label
    {
        private Instellingen _Instellingen;
    }
    public class Class3 : TextBox
    {
        private Instellingen _Instellingen;
    }

如果我有另一个类,那就使用其他类(但它可以是这3个类中的任何一个) 我必须使用开关吗?或者有更简单的方法吗?

    public class AnotherClass
    {
        public AnotherClass ()
        {
            GetInstellingenFromClass(new Class1());
            GetInstellingenFromClass(new Class2());
            GetInstellingenFromClass(new Class3());
        }
        private void GetInstellingenFromClass(Control c)
        {
            switch (c.GetType.ToString())
            {
                case "Class1":
                    Class1 klasse = (Class1) c;
                    //Do something with the _Instellingen of this class
                    break;
                case "Class2":
                    Class2 klasse2 = (Class2) c;
                    //Do something with the _Instellingen of this class
                    break;
                case "Class3":
                    Class3 klasse3 = (Class3)c;
                    //Do something with the _Instellingen of this class
                    break;

            }
        }
    }

(是否存在某些东西,所以我可以做一些像c._Instellingen - >而不先将其转换为正确的类型,其中c类型无关紧要?)

我希望你理解我的问题。

由于

5 个答案:

答案 0 :(得分:5)

您应该创建一个interface属性Instellingen并在三个类中实现它。

例如:

interface IHasInstellingen {
    Instellingen Instellingen { get; }
}

public class Class1: Label, IHasInstellingen {
    public Instellingen Instellingen { get; private set; }
}
public class Class2: Button, IHasInstellingen {
    public Instellingen Instellingen { get; private set; }
}


private void GetInstellingenFromClass(IHasInstellingen c) {
    Instellingen ig = c.Instellingen;
    //Do things...
}
//Alternatively:
private void GetInstellingenFromClass(Control c) {
    IHasInstellingen hi = c as IHasInstellingen;
    if (hi == null)
        return;     //Or throw an ArgumentException

    Instellingen ig = hi.Instellingen;
    //Do things...
}

答案 1 :(得分:1)

Polymorphism。在您的情况下,所有类都会延伸Label,因此您可以Label定义Instellingen

public class Label
{
    public Instellingen Instellingen
    {
        get { return ...; }
    }
}

然后AnotherClass可以使用Label s:

    private void GetInstellingenFromClass(Label l)
    {
        var instellingen = l.Instellingen;

        // do something with instellingen here
    }

当然,如果您不拥有Label类,您可以始终对其进行子类化并从您的类中使用它。另一种选择是使用属性定义接口,并使AnotherClass依赖于该接口。

答案 2 :(得分:1)

不,您不必使用开关。实际上,Interface概念正是您所寻找的。喜欢的东西;

public interface IIntelingenProvider
{
    Intelingen Item {get;}
}

public class Class1: Label, IIntelingenProvider
{
    private Instellingen _Instellingen;
    public Intelingen Item { get { return _Instellingen; } }
}

public class Class2: Label, IIntelingenProvider
{
    private Instellingen _Instellingen;
    public Intelingen Item { get {return _Instellingen; } }
}

您要向GetInstellingenFromClass方法提供的类型是IIntelingenProvider。因此你可以把它写成;

    private void GetInstellingenFromClass(IIntelingenProvider c)
    {
        // regardless of the type, they all have an Item property of type Intelingen
        // c.Item
    }

我建议您阅读并详细了解InteritancePolymorphism

答案 3 :(得分:0)

您是否可以创建一个中间基类,而不是像LabelWithInstellingen那样创建一个中间基类?

答案 4 :(得分:0)

考虑使用接口在需要它们的类中公开Instellingen属性。

class Instellingen
{
    public int ID { get; set; };
}
interface IHasInstellingen
{
    Instellingen Instellingen { get; set; }
}

class MyLabel: Label, IHasInstellingen
{
    public Instellingen Instellingen { get; set; }
}
class MyButton: Button, IHasInstellingen
{
    public Instellingen Instellingen { get; set; }
}

class AnotherClass
{
    public AnotherClass ()
    {
        GetInstellingenFromClass(new MyLabel());
        GetInstellingenFromClass(new MyButton());
        // ...
    }
    private void GetInstellingenFromClass(IHasInstellingenc)
    {
        Console.WriteLine( c.Instellingen.ID );
        // ... Do something with Instellingen
    }
}