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

通过接口访问不同的对象属性?C#,c#,interface,factory,C#,Interface,Factory,我正在用C#上的工厂模式编程一个dll。工厂接收枚举并返回接口。根据收到的枚举,它创建不同的对象并返回封装在接口中的对象。工厂中的任何类都实现该接口,其访问修饰符是内部的,除了自己的公共接口 问题是当我从主项目调用dll时。在工厂内创建的每个对象都有不同的属性,不知道为什么我不能从主目录访问或修改这些属性。要帮忙吗 这是从总机打来的工厂电话 IConfigurator config=ConfigFactory.Instance.CreateConfigurator(Model.First) 这是

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

问题是当我从主项目调用dll时。在工厂内创建的每个对象都有不同的属性,不知道为什么我不能从主目录访问或修改这些属性。要帮忙吗

这是从总机打来的工厂电话

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

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

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


谢谢。

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

样本:

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

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

简单的回答是,您将返回一个接口,因此只有作为接口一部分的属性才可用,直到您将对象强制转换为其具体类型为止

例如:

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执行此操作吗?或者我应该将其修改为public?我想您是指
Main()
方法,对吗?如果它们在同一个集合中,那就不会有问题。如果没有,那么它需要知道类的情况是的。是的,是Main()。但不在同一工作区中的是两个不同的项目。我已经修改了上面的问题,在那里你可以看到一段代码。对工厂的主要呼叫在一个项目中,工厂在另一个项目中。
// 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;