我有用户喜欢这样的简单结构:声明变量动态
public Guest() : IUser
{
}
[Table("Users")]
public class Customer : Guest
{
[Key]
public string UserName { get; set; }
public string Password { get; set; }
public string Address { get; set; }
public bool IsAdmin { get;protected set; }
public UserCart UserCart { get; private set; }
public Customer()
{
}
public Customer(string username, string password, string address)
{
this.Address = address;
this.UserName = username;
this.Password = password;
this.IsAdmin = false;
this.UserCart = new UserCart();
}
}
public class Admin : Customer
{
public Admin()
{
}
public Admin(string username, string password,
string address)
: base(username, password, address)
{
IsAdmin = true;
}
}
继承是基于操作他们能做到。系统将根据使用者的不同而有所不同。
管理员可以浏览和购买订单和货物,
客户可以浏览和购买。
客人只能浏览(当然登录/注册)。
要知道谁是我们的当前用户,我们需要我们的Authentication class
里面的属性或字段是IUser
,所以任何人,管理员,客户和客户也可以在它实例化。 问题是,当我只有这个IUser时,当我实例化时,我基本上可以做任何事情。
所以问题:我想加载该字段或属性,我仍然想访问它的功能 - 但只有那些给定的用户可以,所以如果管理员登录,我想做管理员的工作。如果客户登录,我只希望能够列出货物等。这个怎么做?
编辑:与反思试图
public class Guest : IUser
{
public Guest()
{
}
public object Get()
{
Type type = this.GetType();
var result = Activator.CreateInstance(type);
return result;
}
}
这Get()
方法只给出了一个object
但如果它是由一个叫Guest
,它必须是客户。如果由Admin
调用,它必须是Admin。 我可以使用覆盖来做到这一点,但以后很难修改。
所以,我希望这样的:
(MyObject)Activator.CreateInstance(type);
凡MyObject
是,如果从一个客户,管理员称为如果从管理员叫游客。我错过了什么?当然我尝试了泛型,但是当我实现接口的时候,它需要一个具体的类型,所以基本上我需要在所有的后代类中实现它。
如果您想为您的案例使用此方案,正如您已经指出的那样,不能解决问题。你需要改变类继承的方式。你不这么认为吗?我认为'IUser'需要一个公共的方法'登录' –
谢谢你伸出援助之手。 这不仅取决于我,还有一大堆其他方法,我只是想在此保持简单。 我的经验是,我将在'IUser'中定义的方法中使用'reflection',比如'Get()',它将返回变量的实际类型。可行? – agiro
我已经在一些我们制作的游戏中使用了这个功能。基本上,我们有'Monster'类和'User'类,它们来自'Unit'。我有一个方法'GetUnitType()'defiend在基类中。它也相当快:) –