2012-10-19 43 views
0

我得到這個例外...System.ArgumentNullException

System.ArgumentNullException: Value cannot be null. 
Parameter name: typeName 
    at HomeInventory2.Services.Factory.GetService(String servicename) in C:\Users\Protego\Documents\Visual Studio 2010\Projects\HomeInventory2\HomeInventory2\Services\Factory.cs:line 37 
    at HomeInventory2.Business.Manager.GetService(String name) in C:\Users\Protego\Documents\Visual Studio 2010\Projects\HomeInventory2\HomeInventory2\Business\Manager.cs:line 14 
    at HomeInventory2.Business.InventoryMngr.Create(CreateInventory inv) in C:\Users\Protego\Documents\Visual Studio 2010\Projects\HomeInventory2\HomeInventory2\Business\InventoryMngr.cs:line 19 
    at HomeInventory2.Form1.submitButton_Click(Object sender, EventArgs e) in C:\Users\Protego\documents\visual studio 2010\Projects\HomeInventory2\HomeInventory2\Form1.cs:line 52 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

從這個代碼詞幹 -

private void submitButton_Click(object sender, EventArgs e) 
     { 
      CreateInventory create = new CreateInventory(); 
      create.ItemAmount = textBoxAmount.Text; 
      create.ItemCategory = textBoxCategories.Text; 
      create.ItemProperties = textBoxValue.Text; 
      create.ItemValue = textBoxValue.Text; 

      InventoryMngr invtryMngr = new InventoryMngr(); 
      invtryMngr.Create(create); 

     } 

該代碼的文件應該端與這些值被保存到一個文本創建文件。顯然有些東西正在分解 - 我假設在InventoryMngr文件中看起來像這樣。

namespace HomeInventory2.Business 
{ 
    public class InventoryMngr : Manager 
    { 
     /// <summary> 
     /// persists the inventory information 
     /// </summary> 
     /// <param name="inv"></param> 
     public void Create(CreateInventory inv) 
     { 
      InventorySvc inventorySvc = 
      (InventorySvc)GetService(typeof(InventorySvc).Name); 
      inventorySvc.CreateInventory(inv); 
     } 
    } 
} 

業務經理獲得服務

namespace HomeInventory2.Business 
{ 
    public abstract class Manager 
    { 
     private Factory factory = Factory.GetInstance(); 
     protected IService GetService(String name) 
     { 
      return factory.GetService(name); 
     } 
    } 
} 

,工廠的getService

public IService GetService(string servicename) 
{ 
    Type type; 
    Object obj = null; 
    try 
    { 
     type = Type.GetType(GetImplName(servicename)); 
     obj = Activator.CreateInstance(type); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Exception occured: {0}", e); 
     throw e; 
    } 
    return (IService)obj; 
} 

GetImplName

private string GetImplName(string servicename) 
     { 
      NameValueCollection settings = 
       ConfigurationManager.AppSettings; 
      return settings.Get(servicename); 
     } 
+0

哪裏'拋出新ArgumentNullException (「typeName」);'線位於? – Sklivvz

+1

你不必假設,在你的處置使用調試工具 – codingbiz

+1

對不起,但我不明白,有什麼問題嗎?如果那是'錯誤在哪裏?'比它在'Factory.cs:line 37'中,堆棧跟蹤狀態非常明顯。 Plz澄清你的問題。 –

回答

2

這是你的問題:

NameValueCollection settings = ConfigurationManager.AppSettings; 
return settings.Get(servicename); 

確保您的app.config/web.config具有正確的AppSettings值。 settings.Get(servicename)找不到servicename的關鍵字。

因此,如果服務名是 「AwesomeService」,你需要像的appSettings元素:

<add key="AwesomeService" value="somevalue"/>

-1

我修改您的代碼像波紋管:

public void Create(CreateInventory inv) 
{ 
    InventorySvc inventorySvc = 
     (InventorySvc)GetService((typeof(InventorySvc)).toString()); 
    inventorySvc.CreateInventory(inv); 
} 
+0

,只是給我一個錯誤,說System.Type不包含toString的定義... – Expecto

+1

這不會改變任何東西,因爲字符串名稱已經傳遞給'GetService'。 'typeof(InventorySvc).Name'正確返回'InventorySvc'的字符串名稱。 – Gromer

相關問題