界面问题

时间:2010-01-12 07:13:33

标签: c# interface

  

可能重复:
  IF structure issue
  Logic problem while setting conditions

我有以下代码:

foreach (DataModelObject dmo in allObjects)
{
    if (string.Compare(dmo.Name, hostName, true) == 0)
    {
        if (dmo is IResourcePolicy)
        {
            IResourcePolicy irp = (IResourcePolicy)dmo;
            irp.ResourcePolicy = rp;
            irp.AgentPolicyVersion.Version = Convert.ToInt64(policyVersion);
            irp.ResourcePolicyEnabled = Convert.ToBoolean(enabled);
            irp.AgentVersion = agentVersion;

            // Distribute the object without saving it.
            SpoServer.Spurt.ServerSendObject(dmo, true, 0);
            break;
        }
    }
}

这里我要分配“irp.AgentVersion = agentVersion;”在主循环之外,如果(dmo是IResourcePolicy)更多地忽略了循环 像这样 如果我这样做

foreach (DataModelObject dmo in allObjects)
{
    IResourcePolicy irpa ;
    irpa.AgentVersion = agentVersion;
}

我收到错误错误使用未分配的本地变量'irpa'

我该怎么办?

3 个答案:

答案 0 :(得分:2)

我不确定你究竟想要实现什么,但这里有一些选择:

如果DataModelObject类包含AgentVersion属性,您可以这样做(尽管很可能不是这样):

foreach (DataModelObject dmo in allObjects)
{
    dmo.AgentVersion = agentVersion;
}

如果AgentVersion仅在某些派生类(不是全部)中实现,那么您需要明确检查派生类是否实现了该接口,就像您现在正在做的那样:< / p>

foreach (DataModelObject dmo in allObjects)
{
    if (dmo is IResourcePolicy)
    {
         IResourcePolicy policy = (IResourcePolicy)dmo;
         policy.AgentVersion = agentVersion;
    }
}

第三种情况是你有几个派生类没有实现相同的接口,但仍然具有AgentVersion属性。解决这个问题的最简单方法(如果你可以改变源代码)就是让所有这些对象实现相同的接口,包含它们共有的属性:

interface IAgentVersion
{
     string AgentVersion { get; }
     // omit other properties which are not common to all objects
}

interface IResourcePolicy : IAgentVersion
{
     string ResourcePolicy { get; }
     // ...
     // add all policy-specific properties
}

现在您确定所有IAgentVersionIResourcePolicy对象都实现了该公共属性(AgentVersion),您只需要检查基接口:

foreach (DataModelObject dmo in allObjects)
{
    if (dmo is IAgentVersion)
    {
         IAgentVersion = (IAgentVersion)dmo;
         policy.AgentVersion = agentVersion;
    }
}

答案 1 :(得分:1)

我不知道你想要达到的目标。我只能突出你的错误:

foreach (DataModelObject dmo in allObjects)
{
    IResourcePolicy irpa ; // <-- declaring but not instantiated or assigned
    irpa.AgentVersion = agentVersion; // <-- hence this error...
}

答案 2 :(得分:0)

irpa是一个类的实例,这意味着它是一个引用类型。需要使用new()运算符初始化引用类型变量,或者需要使用'='运算符指向相同类型的现有变量。

IResourcePolicy irpa = new IResourcePolicy() ;
irpa.AgentVersion = agentVersion;

但是,语法表明irpa可能是一个接口 - 它是抽象的,因此不能以这种方式使用