【问题标题】:c# - type used as a variablec# - 用作变量的类型
【发布时间】:2012-09-30 20:46:30
【问题描述】:

我有一个简单的业务经理外观,应该只保留一些库存信息。但是我不断收到“Home.Services.InventorySvc”是一种用作变量的类型的错误。

我的门面代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Home.Domain;
using Home.Services;

namespace Home.Business
{
    public class InventoryMngr
    {
        public void Create(CreateInventory inv) 
        {
            Factory factory = Factory.GetInstance();
            InventorySvc invSvc =
            (InventorySvc)factory.GetService(
            (InventorySvc).Name);
            invSvc.CreateInventory(inv);
        }
    }
} 

InventorySvc 代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Home;
using Home.Domain;

namespace Home.Services
{
    public interface InventorySvc : IService
    {
        void CreateInventory(CreateInventory createinventory);
    }
}

【问题讨论】:

  • The homework tag is now officially deprecated 所以很遗憾我们不能在新问题上使用它
  • (InventorySvc).Name(因为这最初被标记为作业)。据推测,这应该是来自某个地方的字符串。您使用的是类型名称,而不是实例,因此没有可从中检索 Name 属性的对象。
  • 是的,factory.GetService 调用看起来很可疑。

标签: c#


【解决方案1】:

您正在使用(InventorySvc).Name,它与InventorySvc.Name 相同,因此将访问InventorySvc 类的静态成员。因为它不是类而是接口,所以不能有静态成员。

【讨论】:

  • 也许应该是typeof(InventorySvc).Name。虽然InventorySvc 不能用作“变量”,但typeof(InventorySvc) 给出了System.Type 类型的对象,而System.Type 确实有一个名为Name 的实例属性(它继承自其基类@987654330 @)。
【解决方案2】:
InventorySvc invSvc = (InventorySvc)factory.GetService((InventorySvc).Name);

此代码应检索实现InventorySvc 的类型的实例。但是,您似乎正在尝试传递该类型的一个实例,这是没有意义的——语法错误并且您尚未实例化该类型。大概,你甚至不知道具体的类型,只是接口类型。工厂和接口已经抽象了实现(通常是一件好事)。

在您的示例中,工厂可能期望类型的名称为字符串(我不会通过辩论这是否是一件好事而使答案过于复杂)。作为回报,工厂将实例化一个实现InventorySvc 的实例并返回它。只有这样你才能调用实例成员,例如“Name”属性。

作为旁注,接口名称should start with an I in c#,例如IInventorySvc。这让您和阅读您的代码的任何人都更清楚它是一个接口。

另见:https://stackoverflow.com/a/681815/453277

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 2022-01-06
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2015-09-17
    • 2011-01-07
    相关资源
    最近更新 更多