2017-07-18 122 views
0

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

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

这是来自主工厂的调用。

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); 

     } 

    } 

第一,第二和第三个具有不同的属性,我不能够从接口对象修改它收到

谢谢。

+0

您通过您的意思不能修改的属性?您需要分享您的代码,以便我们能够提供适当的解决方案。 –

+2

使用接口的关键在于你有符合接口和代码的对象,它们能够平等对待它们。这听起来不像你这样的情况。 – Luaan

+0

不好意思,我已经用代码示例编辑了这个问题。 – user462916

回答

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; 
+0

好的,谢谢。我已经尝试过了,但现在的问题是不同的类没有相同的属性,所以如果我在接口中实现属性,每个类必须独立实现属性,如果它的类具有此属性或不具有此属性。 – user462916

+0

只将属性放入需要的接口中。当您从方法调用中取回接口的实例时,如果需要访问具体类型的其他属性,则将其作为具体类型进行转换。 –

+0

好的,但我能从主考虑到要投的类是内部的吗?或者我应该修改它为公众? – user462916

0

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

样品:

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

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