通过接口访问不同的对象属性? C#

时间:2017-07-18 07:43:43

标签: c# interface factory

我正在使用C#上的工厂模式编写一个dll。工厂收到枚举并返回一个界面。根据收到的枚举,它会创建不同的对象并将其封装在界面中。工厂内的任何类都实现了接口,其访问修饰符是内部的,除了自己的公共接口。

问题是当我从主项目调用dll时。在工厂内创建的每个对象都有不同的属性,而不是为什么我无法从main访问或修改这些属性。一些帮助?

这是来自主要工厂的工厂电话。

IConfigurator config = ConfigFactory.Instance.CreateConfigurator(Model.First);

这就是工厂的工作方式(在dll中):

public IConfigurator CreateConfigurator(Model model)
    {
        switch (model)
        {
            case Model.First:
                return (First)new First(model);

            case Model.Second:
                return (Second)new Second(model);

            case Model.Third:
                return (Third)new Third(model);

        }

    }

首先,Second和Third具有不同的属性,我无法从接收的接口对象

修改它

感谢。

2 个答案:

答案 0 :(得分:1)

简短的回答是您正在返回一个接口,因此在将对象转换为具体类型之前,只有属于该接口的属性才可用。

例如:

public class A : INameable
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class B : INameable
{
   public string Name { get; set; }
   public string Description { get; set; }
}

public Interface INameable
{
   string Name { get; set; }
}

public Enum Selector
{
    A,
    B
}

所以如果我使用如下方法

public INameable GetINameable(Selector selector)
{
   if (selector.Equals(Selctor.A))
       return new A { Name = "Name A", Age = 10 };
   if (selector.Equals(Selector.B))
       return new B { Name = "Name B", Description = "New Instance of B"};
}

我将返回INameable的实例,并且只能访问界面中定义的Name属性。

但是,如果我需要访问其他属性,那么我需要将返回的对象强制转换为具体类型,如下所示:

// This will be an instance of INameable
var obj = GetINameable(Selector.A);

// Now cast as an instance of A
var castObj = obj as A;

// We can now access the Age property
var age = castObj.Age;

答案 1 :(得分:0)

该方法只能有一种返回类型。 不是通过枚举选择结果,而是为每个项目创建不同的工厂方法/工厂类。

样品:

// instead of this
public enum FactoryEnum {
   VariantA,
   VariantB,
   VariantC
}
object Create(FactoryEnum item);

// do this
IMyInterfaceA CreateA();
IMyInterfaceB CreateB();
IMyInterfaceC CreateC();