2016-04-12 51 views
0

我正在使用Microsoft Azure的庫。我試圖動態地返回一個容器列表,我可以將它作爲參數傳遞給Microsoft Azure的代碼。兩種方法都屬於同一類。無法將方法1中的列表<string>傳遞給方法2

ListContainer()

static public List<string> ListContainer(StartConfig config) 
{ 
    List<string> container = new List<string>(); 

    if (config == null || config.BlobClient == null) 
    { 
     config = Program.GetConfig(); 
    } 

     //Get the list of the blob from the above container 
    IEnumerable<CloudBlobContainer> containers = config.BlobClient.ListContainers(); 

    foreach (CloudBlobContainer item in containers) 
    { 
     container.Add(item.Name); 
    } 

    //Adding a print statement 
    Console.WriteLine(String.Join("\n", container)); 
    Console.WriteLine("\n"); 

    return container; 
} 

GetConfig()

public static StartConfig GetConfig() 
{ 
    StartConfig config = new StartConfig(); 

    // Retrieve storage account from connection string. 
    config.StorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 

    // Create the blob object. 
    config.BlobClient = config.StorageAccount.CreateCloudBlobClient(); 


    //Get a reference to a container to use for the sample code, and create it if it does not exist. 
    config.Container = config.BlobClient.GetContainerReference(//List of Container names which are returned from ListContainer()); 

    //Create the container if it does not exisit. 
    config.Container.CreateIfNotExists(); 

    return config; 
} 

我累到只需調用方法ListContainer()var test = ListContiner(null),並把我的GetConfig()內。當我這樣做時,我會得到一個StackOverflowException。這是因爲ListContainer正在檢查以確保config不爲空,然後運行GetConfig()並將其分配給配置。如果任何人有任何想法如何簡單地填充config.Container = config.BlobClient.GetContainerReference(CONTAINER_NAME);GetConfig()與容器列表ListContainers()這將是驚人的!

回答

2

當你把var test = ListContainer(null)GetConfig方法,只要您撥打GetConfig,它會調用ListContainer(null),用來檢查是否config == null,並再次調用GetConfig,throwning的StackOverflowException

你必須以某種方式打破這個循環。 我的建議是不要在ListContainer內撥打GetConfig,而需要一個config傳遞給它,並且如果呼叫者不需要保護自己,那麼就要保護自己。

public static List<string> ListContainer(StartConfig config) 
{ 
    if (config == null) 
     throw new ArgumentNullException("config"); 
    if (config.BlobClient == null) 
     throw new ArgumentException("BlobClient must not be null", "config"); 

    List<string> container = new List<string>(); 

    //Get the list of the blob from the above container 
    IEnumerable<CloudBlobContainer> containers = config.BlobClient.ListContainers(); 

    foreach (CloudBlobContainer item in containers) 
    { 
     container.Add(item.Name); 
    } 

    //Adding a print statement 
    Console.WriteLine(String.Join("\n", container)); 
    Console.WriteLine("\n"); 

    return container; 
} 

也將改變GetConfig方法調用ListContainer傳遞config

public static StartConfig GetConfig() 
{ 
    StartConfig config = new StartConfig(); 

    // Retrieve storage account from connection string. 
    config.StorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 

    // Create the blob object. 
    config.BlobClient = config.StorageAccount.CreateCloudBlobClient(); 

    var containers = ListContainer(config); 

    //Get a reference to a container to use for the sample code, and create it if it does not exist. 
    config.Container = config.BlobClient.GetContainerReference(//List of Container names which are returned from ListContainer()); 

    //Create the container if it does not exisit. 
    config.Container.CreateIfNotExists(); 

    return config; 
} 
+0

你能提供一點我怎麼會去這樣做的「您需要配置一個代碼示例被傳遞給它和一名保護自己的衛兵「? – jdave

+0

我已經做了。方法開始處的兩個if將針對空配置和config.BlobClient保護您的方法。 –