我正在使用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?提前谢谢。
发布于 2013-10-22 17:40:49
你只需要引入一个支持变量
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;
}
}发布于 2013-10-22 17:40:50
对于第一个,在BlogId中,您将返回BlogId,它会触发返回的Getter .BlogId。砰,堆叠溢出。在公共getter中返回blogIdGuid而不是BlogId。
我猜第二个是与第一个相关的,但是如果没有更多的代码,我就不能马上说出来。
编辑:喔,误读了代码。是的,使用一个名为_blogId的背景类级属性,并在setter中设置它,然后在getter中返回它。
发布于 2013-10-22 17:35:30
您的get方法正在调用自己,您的set方法实际上是通过设置该方法的本地值来发出no。如果要在getter和setter中执行某些操作,则需要为您的属性提供一个支持字段:
private Guid _blogId;
public Guid BlogId
{
get
{
return _blogId;
}
set
{
//some operation against value here, Validate(value), etc.
_blogId = value;
}
}如果在getter/setter中没有要采取的操作,则可以使用汽车特性,它将为您生成支持字段:
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;
}https://stackoverflow.com/questions/19524408
复制相似问题