2015-12-23 50 views
2

我已经创建了ParseObject的子类。我有一个List类型的属性。当我尝试使用属性获取值时,我得到一个null;如果我使用属性名称作为索引访问该值,我会得到预期值,即字符串列表。作为属性访问子类中的值与列表<>

我期望这些技术是等同的,并且通过属性访问更加可取,因为它不会让您显示拼写错误。任何人都可以帮助我理解(a)他们为什么不相同,以及(b)我如何通过财产成功获取价值?

例子:

[ParseClassName("MyThing")] 
public class MyThing : ParseObject 
{ 
    [ParseFieldName("Name")] 
    public string Name 
    { 
     get { return GetProperty<string>("Name"); } 
     set { SetProperty<string>(value, "Name"); } 
    } 

    [ParseFieldName("Notes")] 
    public List<string> Notes 
    { 
     get { return GetProperty< List<string> >("Notes"); } 
     set { SetProperty< List<string> >(value, "Notes"); } 
    } 
} 

elsewhere... 

    var name = aThing.Name;  // I get the expected name 
    var asProp = aThing.Notes;  // I get *null* 
    var asIndex = aThing["Notes"]; // I get an array of strings 
+0

如果将其更改为“GetProperty ”,会发生什么情况? – Rob

+0

我不明白。只要改变getter就会返回一个与属性类型不兼容的类型。你的意思是把整个事情改成string []? – jrl

+0

是的,基本上。作为一种健康检查。我没有使用'parse'库,但我认为它对于它的集合是严格的。虽然它认为该属性是一个数组,但您已经要求提供一个列表。如果数组* *工作,那么要么将逻辑放入属性中以转换为数组和列表 - 否则您只需继续使用数组而不是列表。 – Rob

回答

1

事实证明,你必须声明的类型为IList的<>,没有列出<>。我曲解了解析文档支持的数据类型中,说:

objects that implement IList<T> 

意味着一个可以实际使用的IList <的实现>。并非如此:从其GetProperty <IList>返回的类型是Parse.Internal.FlexibleListWrapper。具体值与SetProperty <>兼容,但不兼容GetProperty <>。我想这个故事的寓意是,Parse不会关心自己试图转换为任何具体的类型,这似乎足够合理。如果你想在你的属性声明中保留具体类型,你总是可以在你的getter中做一个转换。