C# - 带有参数的扩展属性,通过静态类

时间:2015-11-19 08:23:59

标签: c#

我希望通过userIdUserState的{​​{1}}属性IsOnline获取用户状态(在线或离线)。

我的示例代码在没有第一个用户的情况下正常工作:

using System;
using System.Collections.Generic;

namespace MyProgram
{
    public static class User
    {
        public static Dictionary<string, string> OnlineUsers = 
            new Dictionary<string, string>();

        public static void AddOnlineUser(string userId, string name)
        {
            OnlineUsers.Add(userId, name);
        }
    }

    public static class UserState
    {
        public static bool IsOnline
        {
            get
            {
                return CheckingUserOnline(UserInfo.Id);
            }
            set
            {
                IsOnline = value;
            }
        }
        private static bool CheckingUserOnline(string userId)
        {
            var onlineUsers = User.OnlineUsers;
            return onlineUsers.ContainsKey(userId);
        }
    }

    public class UserInfo
    {
        public static string Id { get; set; }
        public UserInfo(string id)
        {
            Id = id;
        }
    }

    public class MainClass
    {
        static void Main()
        {
            User.OnlineUsers.Add("A101", "King");
            User.OnlineUsers.Add("A102", "Queen");
            User.OnlineUsers.Add("A103", "Jack");

            string[] ids = { "A101", "A103", "A104", "A105", "A102" };
            foreach (string id in ids)
            {
                var user = new UserInfo(id);
                string name = User.OnlineUsers.ContainsKey(id) ?
                   User.OnlineUsers[id] : "N-" + id;

                string status = UserState.IsOnline ? "Online" : "Offline";

                Console.WriteLine(string.Format("User id: {0}.\nName: {1}.\nStatus: {2}",
                    id, name, status));

                Console.WriteLine("_______________\n");
            }
        }
    }
}

没有打印User id:行。

以下是快照:

enter image description here

这是我的问题。你能帮我解决一下吗?

还有两个小问题:

  • 班级IsOnline中的媒体资源UserState是否为extension property

  • 从不使用第user行中的对象var user = new UserInfo(id); 我已经定义它以存储当前用户ID。我想是的 不适合创建一个从未使用过的变量。还有另一种方法吗? 将id设置为构造函数public UserInfo(string id){}

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你正在寻找这样的东西:

public class User
{
    private static Dictionary<string, string> _onlineUsers = new Dictionary<string, string>();

    public static void AddOnlineUser(string userId, string name)
    {
        _onlineUsers.Add(userId, name);
    }
    public static bool IsUserOnline(string userId)
    {
        return _onlineUsers.ContainsKey(userId);
    }
    public static string GetUser(string userId)
    {
        return _onlineUsers[userId];
    }
}

public class UserInfo
{
    public string Id { get; set; }

    public bool IsOnline
    {
        get
        {
            return User.IsUserOnline(this.Id);
        }
    }

    public UserInfo(string id)
    {
        Id = id;
    }
}

class Program
{
    static void Main(string[] args)
    {
        User.AddOnlineUser("A101", "King");
        User.AddOnlineUser("A102", "Queen");
        User.AddOnlineUser("A103", "Jack");

        string[] ids = { "A101", "A103", "A104", "A105", "A102" };

        foreach (string id in ids)
        {
            var user = new UserInfo(id);
            string name = User.IsUserOnline(id) ? User.GetUser(id) : "N-" + id;

            string status = user.IsOnline ? "Online" : "Offline";

            Console.WriteLine(string.Format("User id: {0}.\nName: {1}.\nStatus: {2}", id, name, status));

            Console.WriteLine("_______________");
        }
    }
}
  1. C#中不存在扩展属性。
  2. 我用过你。 = P
  3. 可能是第一行未出现的最佳原因是:屏幕上的信息太多。尝试最大化控制台窗口并将滚动条放在最开始。