c# - 如何扩展 C# 类

标签 c# .net

我有类似的代码

IEnumerable<TwitterStatus> mentions = service.ListTweetsOnHomeTimeline();
RecentTweetList.ItemsSource = mentions;

我想做的是以某种方式添加到 TwitterStatus 1 个额外的属性来转换该类的 CreatedDate 以获取分钟数。 (我无法重新设计 TwitterStatus。)

所以我猜想这样做:

public class NewTwitterStatus : TwitterStatus
{
        public string MinAgo 
        {
            get 
            {
                TimeSpan diff = DateTime.Now.Subtract(base.CreatedDate);
                return diff.Minutes.ToString() + "m";
            }
        }
}

但我不知道如何进行转换?

IEnumerable<NewTwitterStatus > mentions = (????)service.ListTweetsOnHomeTimeline();

谢谢大家!

解决方案(基于 Chris 的建议):

IEnumerable<NewTwitterStatus> mentions = service.ListTweetsOnHomeTimeline().Select(x => new NewTwitterStatus(x));
RecentTweetList.ItemsSource = mentions;



 public class NewTwitterStatus
    {
        TwitterStatus Data { set; get; }

        public NewTwitterStatus(TwitterStatus ts)
        {
            Data = ts;
            ts = null;
        }

        public string ProfileImageUrl
        {
            get
            {
                return Data.User.ProfileImageUrl;
            }
        }


        public string ScreenName
        {
            get
            {
                return Data.User.ScreenName;
            }
        }

        public string UserName
        {
            get
            {
                return Data.User.Name;
            }
        }

        public string Text
        {
            get
            {                
                return Data.Text;
            }
        }

        public string MinAgo 
        {
            get 
            {
                TimeSpan diff = DateTime.Now.Subtract(Data.CreatedDate);
                int mins = diff.Minutes * -1;

                if (mins < 60)
                    return mins.ToString() + "m";
                else  
                {
                    double h = mins / 60;
                    double m = mins % 60;
                    return h.ToString()  + "h " + m.ToString() + "m";
                }


            }
        }

最佳答案

您不能以这种方式扩展类 - 您收到的 TwitterStatus 实例根本没有您想要的属性。一种解决方法是使用扩展方法:

public static class TwitterExtensions
{
    public static string MinutesAgo(this TwitterStatus status)
    {
        TimeSpan diff = DateTime.Now.Subtract(status.CreatedDate);
        return diff.Minutes.ToString() + "m";
    }
}

现在您可以在 TwitterStatus 实例上调用 MinutesAgo() 方法:

foreach(var status in mentions)
{
   string howManyMinutesAgo = status.MinutesAgo();
}

编辑:

您应该能够使用扩展方法 - 另一种方法是使用 AutoMapper 等映射工具将 TwitterStatus 属性复制到您的扩展类中- 这将允许您使用自定义属性对扩展类实例进行数据绑定(bind)。虽然这是很多额外的工作(在计算上,通常不是为了编码),所以如果您能够改用扩展方法,我不会推荐它:

Mapper.CreateMap<TwitterStatus, NewTwitterStatus>();
IEnumerable<TwitterStatus> mentions = service.ListTweetsOnHomeTimeline();
IEnumerable<NewTwitterStatus> extendedMentions = mentions.Select(x=> Mapper.Map<NewTwitterStatus>(x));

关于c# - 如何扩展 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364083/

相关文章:

C# 泛型转换

c# - 如何限制 visual studio 中窗体的最小尺寸?

c# - JsonConverter CanConvert 不接收类型

c# - 如何在我的 C# 网站中使用 LAME (lame_enc.dll)

c# - C# 中的 TCPClient 与套接字

c# - IndexOutOfRangeException - 假设 0

c# - .Net 中有关 Google Drive 的错误

c# - 从现有数据库向 DbContext 添加表?

c# - 当传递给另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

c# - 检测 WebBrowser 控件上的滚动