我正在使用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?提前谢谢。
答案 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;
}
}