1

我创建的显式接口存在问题,并且出现异常,

“x”不包含“y”的定义,并且找不到接受“x”类型的第一个参数的扩展方法“y”

我有一系列的课程。基类:

public interface IFactoryResponse
{
    object instance { get; set; }
    string instanceconfig { get; set; }
}

显式实现它的类:

public class FactoryResponseImpl : IFactoryResponse
{
    object IFactoryResponse.instance {
        get { return ((IFactoryResponse)this).instance; }
        set { ((IFactoryResponse)this).instance = value; }
    }

    string IFactoryResponse.instanceconfig   {
        get { return ((IFactoryResponse)this).instanceconfig; }
        set { ((IFactoryResponse)this).instanceconfig = value; }
    }
}

在另一堂课中,我得到了上述错误。Visual Studio 可以找到接口和类,但它无法解析实例属性。我在这里想念什么。我可能错过了显式继承的更精细的规则之一。

if (facconfig.useabstract) {
    response.instance = Activator.CreateInstance(m_entassembly.GetType(entconfig.Classname, true, true));
    response.instanceconfig = facconfig.config;
} else {
    Assembly assem = Assembly.LoadFrom(facconfig.assemblyfile);
    object Obj = Activator.CreateInstance(assem.GetType(facconfig.Classname, true, true));
    response.instance = Obj;
    response.instanceconfig = facconfig.config;
}
4

4 回答 4

2
  1. 您的实现不正确。它会StackOverflowException因为属性调用自身而导致。您可以使用自动属性轻松实现属性:

    public class FactoryResponseImpl : IFactoryResponse
    {
        object IFactoryResponse.instance { get; set; }
    
        string IFactoryResponse.instanceconfig { get; set; }
    }
    
  2. 当显式实现接口成员时,您必须将变量视为接口,通过将类实例转换为该接口或将其分配给该接口的变量类型。

    if (facconfig.useabstract) {
        ((IFactoryResponse)response).instance = Activator.CreateInstance(m_entassembly.GetType(entconfig.Classname, true, true));
        ((IFactoryResponse)response).instanceconfig = facconfig.config;
    } else {
        Assembly assem = Assembly.LoadFrom(facconfig.assemblyfile);
        object Obj = Activator.CreateInstance(assem.GetType(facconfig.Classname, true, true));
        ((IFactoryResponse)response).instance = Obj;
        ((IFactoryResponse)response).instanceconfig = facconfig.config;
    }
    
  3. 为什么需要显式实现接口?除非您有充分的理由,否则您不应该这样做。通过隐式实现,一切都变得容易得多:

    public class FactoryResponseImpl : IFactoryResponse
    {
        public object instance { get; set; }
    
        public string instanceconfig { get; set; }
    }
    

    你的其他代码应该可以正常工作。

于 2014-01-26T18:19:22.417 回答
0

您的显式实现正在引用自己。您应该引用私有字段或公共实现。例如:

public class FactoryResponseImpl : IFactoryResponse
{
    DatabaseFactoryResponseInstance _instance;

    public FactoryResponseImpl()
    {
        _instance = new DatabaseFactoryResponseInstance();
    }

    object IFactoryResponse.instance {
    get { return (object)_instance; }
    set { 
            if (value != null)
            {
                DatabaseFactoryResponseInstance dbInstance;
                dbInstance = value as DatabaseFactoryResponseInstance;
                if (dbInstance == null)
                    throw new InvalidOperationException();

                _instance = dbInstance;
            }
         }
}
于 2014-01-26T18:19:05.847 回答
0

这就是你的目标吗?

public interface IFactoryResponse
        {
            object instance { get; set; }
            string instanceconfig { get; set; }
        }

        public class FactoryResponseImpl : IFactoryResponse
        {
            object IFactoryResponse.instance { get; set; }
            string IFactoryResponse.instanceconfig { get; set; }
        }

        class Test
        {
            public void TestMethod()
            {

                IFactoryResponse response = new FactoryResponseImpl();
                response.instance = null;
            } 
        }
于 2014-01-26T18:19:49.403 回答
0

如果使用像 IFactoryResponse.instance 这样的显式接口实现,那么这些方法是不公开的。您需要强制转换为 IFactoryResponse 才能访问它们,或者将方法定义为公共:公共对象实例 { ... }。

于 2014-01-26T18:20:34.580 回答