【问题标题】:Access to different object properties through an interface? C#通过接口访问不同的对象属性? C#
【发布时间】:2017-07-18 07:43:42
【问题描述】:

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

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

这是来自 main 的 Factory 调用。

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

        }

    }

First、Second 和 Third 具有不同的属性,我无法从收到的接口对象修改它

谢谢。

【问题讨论】:

  • 你的意思是你不能修改属性?您需要分享您的代码,以便我们能够提供适当的解决方案。
  • 使用接口的全部意义在于您拥有符合接口的对象和平等对待它们的代码。听起来你不是这种情况。
  • 对不起,我已经用代码示例编辑了问题。

标签: c# interface factory


【解决方案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;

【讨论】:

  • 好的,谢谢。我已经尝试过了,但我现在遇到的问题是不同的类没有相同的属性,所以如果我在接口中实现属性,每个类必须独立实现属性,如果它的类有没有这个属性。
  • 只在需要的接口中放置属性。当您从方法调用中获取接口的实例时,如果您需要访问具体类型的其他属性,请将其转换为具体类型。
  • 好的,但是考虑到要转换的类是内部的,我可以从主要做吗?还是我应该修改为公开?
  • 我假设您的意思是Main() 方法,对吧?如果它们在同一个程序集中,那将不是问题。如果不是,那么它需要知道类是的。
  • 是的,是 Main()。但不在同一个工作区中的是 2 个不同的项目。我已经修改了上面的问题,在那里你可以看到一段代码。对工厂的主要调用在一个项目中,工厂在另一个项目中。
【解决方案2】:

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

示例:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2014-06-11
    • 2011-02-22
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多