BlogEngine.NET上的System.StackOverflowException

时间:2013-10-22 17:21:22

标签: c# stack-overflow

我正在使用BlogEngine.NET,需要将BlogId设置为特定的Guid(blogIdstr)。我似乎无法弄清楚如何从默认的blogId更改它。这是我目前的代码,但它给了我一个StackOverflowException ...

这两个在基类......

public virtual TKey Id { get; set; }

public Guid BlogId 
{ 
get 
   { 
       return BlogId; <-- Stack Overflow
   }

set
   {
       string blogIdstr = "FCA96EFB-D51C-4C41-9F85-3EEB9C50BDE7";
       Guid blogIdGuid = Guid.Empty;
       blogIdGuid = Guid.Parse(blogIdstr);
   }
}

这个是在blog.cs ...

public override Guid Id
{
get { return base.Id; }
set
{
    base.Id = value;
    base.BlogId = value;
}
}

如何设置blogId并避免StackOverflowException?提前谢谢。

3 个答案:

答案 0 :(得分:1)

对于第一个,在BlogId中,您将返回BlogId,它会触发返回的Getter ... BlogId。繁荣,堆栈溢出。将blogIdGuid返回到您的公共getter而不是BlogId。

我猜第二个与第一个相关,但没有更多的代码,我不能随便说出来。

编辑:哎呀,误读了代码。是的,使用一个名为_blogId的支持类级属性,并在setter中设置它并将其返回到getter中。

答案 1 :(得分:0)

您的get方法正在调用自身,而您的set方法实际上是通过设置方法的本地值来发出no-op。如果您想在getter和setter中执行某些操作,则需要为您的属性提供支持字段:

private Guid _blogId;
public Guid BlogId 
{ 
   get 
   { 
       return _blogId;
   }

   set
   {
       //some operation against value here, Validate(value), etc.
       _blogId = value;
   }
}

如果你没有接受getter / setter的动作,你可以使用auto property,它会为你生成支持字段:

public Guid BlogId { get; set; }

无法做什么,以及你在这里真正想做的事情是将不同的类型传递给一个属性 - 要做到这一点,你需要一个方法阶级,即:

public bool TrySetBlogId(string newId)
{
    Guid id;
    var stringIsGuid = Guid.TryParse(newId, out id);

    if (stringIsGuid)
    {
        BlogId = id;
    }

    return stringIsGuid;
}

答案 2 :(得分:0)

您只需要引入支持变量

private Guid _blogId;并确保在set方法

中设置该字段
public Guid BlogId 
{ 
get 
   { 
       return _blogId; 
   }

set
   {
       string blogIdstr = "FCA96EFB-D51C-4C41-9F85-3EEB9C50BDE7";
       Guid blogIdGuid = Guid.Empty;
       blogIdGuid = Guid.Parse(blogIdstr);

       _blogId = value;
   }
}