【问题标题】:Facebook C# SDK - .NET 3.5 & Dynamic objectsFacebook C# SDK - .NET 3.5 和动态对象
【发布时间】:2012-02-10 13:29:21
【问题描述】:

我已经为 facebook 下载了 Graph C# SDK,这些示例非常有用且易于理解,但是当我尝试使用动态对象类型作为 FacebookApp.Get("me") 调用的返回对象时,我遇到了困难。

我以前从未使用过动态,所以我做了一些研究,似乎它们是 Visual Studio 2010 的新版本,这是我正在使用的版本,但由于我的生产环境,我无法使用最新的框架......

有没有我可以使用的类型,或者有没有使用 3.5 框架的不同方法来解决这个问题?这是框架二进制文件提供的源文件中的一个示例。

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

我收到一条错误消息,指出我可能缺少动态类型的程序集引用。

非常感谢任何和所有帮助!期待掌握这个 SDK!

【问题讨论】:

  • 我很高兴你提出这个问题,因为我也在寻找一种方法来使用 .net 3.5 中的 sdk(它们包括一个 3.5 文件夹,所以我认为它应该可以工作)。这是我的问题stackoverflow.com/questions/4675364 请密切注意。在我们两个之间,也许有人会回答我们的一个问题。

标签: facebook-c#-sdk


【解决方案1】:

如果您想要强类型的对象,有一种非常简单的方法可以做到这一点。见这里: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; }
}

【讨论】:

    【解决方案2】:

    你可能想看看这篇文章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

    【讨论】:

      【解决方案3】:

      基于此处的其他一些答案,动态对象实际上是从 facebook api 返回的 JSON 对象。 SDK 使用动态类型为底层数据创建更好的接口。

      我不喜欢每次都将对象转换为 IDictionary 的想法,因此我更进一步,创建了一个外观对象,该对象提供了对数据的强类型访问方法。

      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");
              }
          }
      }
      

      【讨论】:

      【解决方案4】:

      动态是 C# 4.0 .Net 4.0 而不是 .Net 3.5

      【讨论】:

      • 我是这么认为的,我不确定如何在 3.5 框架的限制内获得相同的结果?谁能指出我正确的方向?
      • 你需要反思;看看这个:stackoverflow.com/questions/2135533/…
      • 没有任何想法吗? surly sombody 必须在 .net 3.5 中使用它?谢谢!
      • 我担心反思可能是答案。也许我会在我们的生产环境中安装 4.0。
      • Reflection 越过了我的脑海......我不明白为什么 SDK 不能直接将集合放到已知类型?还是键/值对?我真的不能升级到4.0!!
      猜你喜欢
      • 2011-06-08
      • 2011-01-21
      • 1970-01-01
      • 2010-11-15
      • 2013-09-07
      • 2011-09-07
      • 2011-05-28
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多