2016-09-28 2 views
2

私は、MemberModelとCustomPrincipalという2つのクラスを持っています。 CustomPrincipalクラスは、MemberModelクラスを継承します。拡張クラスをベースクラスにマージする

MemberModelクラスには、次のようになります。

CustomPrincipalクラスは次のようになります
namespace example.Models 
{ 
    public class MemberModel 
    { 
     [Required] 
     public string Username { get; set; } 
     [Required] 
     public string Password { get; set; } 

     public bool Remember { get; set; } 
    } 
} 

例で
namespace example.Examples 
{ 
    public class CustomPrincipal : MemberModel, IPrincipal 
    { 
     public CustomPrincipal(IIdentity identity) 
     { 
      this.Identity = identity; 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) { return false; } 
    } 
} 

次の2つのクラスを参照してください下にMemberModelユーザ名、パスワードで満たされているものとUserPrincipalクラスを覚えていて、何がIIDentity情報で埋められていますが、ユーザー名、パスワードではなく、覚えておいてください。

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
MemberModel memberModel = serializer.Deserialize<MemberModel>(authTicket.UserData); 

IIdentity user = HttpContext.Current.User.Identity; 
CustomPrincipal customPrincipal = new CustomPrincipal(user); 

ここで、MemberModelの属性をCustomPrincipalの属性とマージします。

私は複数のものを試しましたが、どれも動作していません。私はCustomPrincipalにMemberModelをキャストしようとしましたが、残念ながらこれは機能しませんでした(下記参照)。

customPrincipal = (CustomPrincipal) memberModel; 
Unable to cast object of type 'example.Examples.Models.MemberModel' to type 'example.Examples.CustomPrincipal'. 

私はまた、2つのオブジェクトをマージするためにリフレクションを使用する、Rob Harleyの例をしようと試みてきたが、これもうまくいきませんでした。

+2

最終的に達成することが期待される結果はなんですか? –

+0

@MongZhu編集の質問:) –

+2

私はあなたのケースで最適なソリューションを引数として 'MemberModel'を取り、手動でこれらのプロパティを設定しますCustomPrincipal''でメソッドを書いたり 'MemberModel' – slawekwin

答えて

0

最後に、私は、正しい方法での反射を利用して、それを修正しました。

PropertyInfo[] props = typeof(MemberModel).GetProperties(); 
foreach (PropertyInfo prop in props) 
{ 
    if (prop.Name != "Password") 
     customPrincipal.GetType().GetProperty(prop.Name).SetValue(customPrincipal, serializeModel.GetType().GetProperty(prop.Name).GetValue(memberModel, null) as string); 
} 

まず我々は、これらすべてのプロパティを通じて、すべてのpropeties MemberModelから、我々ループを取得し、MemberModelの値によってcustomPrincipalの値を設定します。

4

継承のルールでは、基本クラス(MemberModel)を子クラス(CustomPrincipal)にキャストできません。あなただけ

(DOG, CAT) => ANIMAL

私は犬と猫を持っていると私はそれらの両方が動物であることを知っている..ベースに戻し子クラスをキャストする例で

を許可されています。したがって、私は犬と猫を動物として扱うことができます。

CAT => ANIMAL => DOG

のは、猫は動物ですが、あなたは犬にその動物をオンにしたい、することはできませんしましょう!どうして?あなたが本当に犬であるかどうかわからないからです。

ベストは、コンストラクタのオーバーロードを追加するか、MemberModelからCustomPrincipalを返すメソッドを追加することです。

public CustomPrincipal(MemberModel model) 
{ 
    this.Username = model.Username; 
    ... 
} 

または

public static CustomPrincipal FromMember(MemberModel model) 
{ 
    return new CustomPrincipal() 
    { 
     Username = model.Username, 
     ... 
    } 
} 
+0

私の質問は、私はCustomPrincipalにもこれを追加する必要はありませんMemberModelに特別な属性を追加する場合、これを自動的に作成する方法でした。 –

+0

私はあなたのために自動的に物事を行う任意のプログラミングの秘密に気づいていないです。最短の方法は、コンストラクタまたは変換メソッドを作成することです。 –