Facebook C#SDK - .NET 3.5和动态对象

问题描述:

我已经下载了Facebook的C#SDK,这些示例非常有帮助并且易于理解,但是当尝试使用动态对象类型作为返回对象FacebookApp.Get(“我”)电话。Facebook C#SDK - .NET 3.5和动态对象

我从来没有使用过动态,所以我做了一些研究,似乎他们是Visual Studio 2010的新手,这是我使用的版本,但由于我的生产环境,我无法使用最新的框架。 。

是否有我可以使用的类型,或者有没有不同的方式去使用3.5框架?这里是框架二进制文件提供的源文件的例子。

dynamic myInfo = app.Get("me"); 
lblTitle.Text = myInfo.name; 

我收到一个错误消息,指出我可能缺少动态类型的组合引用。

任何和所有的帮助是非常apreciated!期待着掌握这个SDK!

+0

我很高兴你问这个问题,因为我正在寻找一种方式来使用从.NET 3.5也SDK(它们包括一个3.5文件夹,所以我认为它应该工作)。这是我的问题http://*.com/questions/4675364/保持关注它。在我们两个人之间,也许有人会回答我们的一个问题。 – 2011-01-14 04:35:52

动态是C#4.0 .NET 4.0没有.NET 3.5

+0

我这么认为,我不知道如何在3.5框架的限制范围内获得相同的结果?任何人都可以将我指向正确的方向吗? – 2011-01-12 22:43:05

+0

您需要反思;看看这个:http://*.com/questions/2135533/c-3-5-dlr-expression-dynamic-question – Michel 2011-01-13 09:24:47

你可能想看看这篇文章http://blog.prabir.me/post/Facebook-CSharp-SDK-Writing-your-first-Facebook-Application.aspx

var fb = new FacebookClient("access_token"); 

var result = (IDictionary<string, object>)fb.Get("/me"); 
var name = (string)result["name"]; 

MessageBox.Show("Hi " + name); 

您需要将它转换为IDictionary的<字符串,对象>

基于这里的一些其他答案,动态对象实际上是从facebook api返回的JSON对象。 SDK使用动态类型为基础数据创建更好的界面。

我不喜欢每次将对象强制转换为IDictionary的想法,所以我进一步创建了一个Facade对象,为数据提供强类型的访问方法。

public class FBPerson : FBBase 
{ 
    #region constructor 
    public FBPerson(object personObject) 
     : base(personObject) 
    { 
    } 
    #endregion 

    #region Properties 
    public string first_name 
    { 
     get { return ExtractValueAsString("first_name"); } 
    } 
    public string last_name 
    { 
     get { return ExtractValueAsString("last_name"); } 
    } 
    public string name 
    { 
     get { return ExtractValueAsString("name"); } 
    } 
    public string email 
    { 
     get { return ExtractValueAsString("email"); } 
    } 
    public string id 
    { 
     get { return ExtractValueAsString("id"); } 
    } 
    public string link 
    { 
     get { return ExtractValueAsString("link"); } 
    } 
    public string username 
    { 
     get { return ExtractValueAsString("username"); } 
    } 
    public string location 
    { 
     get { return ExtractValueAsString("location"); } 
    } 
    public string gender 
    { 
     get { return ExtractValueAsString("gender"); } 
    } 
    public string timezone 
    { 
     get { return ExtractValueAsString("timezone"); } 
    } 
    public string locale 
    { 
     get { return ExtractValueAsString("locale"); } 
    } 
    public string verified 
    { 
     get { return ExtractValueAsString("verified"); } 
    } 
    public string updated_time 
    { 
     get { return ExtractValueAsString("updated_time"); } 
    } 
    #endregion 

} 

和基类(这样你就可以创建其他的SDK对象外墙)...

public class FBBase 
{ 
    private IDictionary<string, object> fbCollection = null; 
    public FBBase(object collection) 
    { 
     fbCollection = (IDictionary<string, object>)collection; 
    } 

    protected string ExtractValueAsString(string value) 
    { 
     Validate(); 
     return fbCollection[value].ToString(); 
    } 
    protected void Validate() 
    { 
     if (fbCollection == null) 
     { 
      throw new InvalidOperationException("null collection object"); 
     } 
    } 
} 

如果你想强类型对象有一个很简单的方法来做到这一点。在这里看到:https://gist.github.com/906471

var fb = new FacebookClient("access_token"); 

var result = fb.Get<FBUser>("/me"); 

string name = result.Name; 

MessageBox.Show("Hi " + name); 

[DataContract] 
public class FBUser { 
    [DataMember(Name="name")] 
    public string Name { get; set; } 
    [DataMember(Name="first_name")] 
    public string FirstName { get; set; } 
}