我正在微软Azure的图书馆工作。我试图动态地返回一个容器列表,在那里我可以作为参数传递到Microsoft的代码中。这两种方法都在同一个类中。
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不是null,然后运行GetConfig()并将其分配给配置。如果有人对如何简单地在GetConfig()中填充来自ListContainers()的容器列表有任何想法,那就太棒了!
发布于 2016-04-12 18:58:35
当您将var test = ListContainer(null)放入GetConfig方法中时,每当您调用GetConfig时,它都会调用ListContainer(null),这将检查config == null是否并再次调用GetConfig,从而抛出StackOverflowException。
你必须设法打破这个循环。我的建议是,不要在ListContainer中调用ListContainer,而是需要将一个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方法以调用传递config的ListContainer
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;
}https://stackoverflow.com/questions/36581408
复制相似问题