我有用戶喜歡這樣的簡單結構:聲明變量動態
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在基類中。它也相當快:) –