9

一部のアセンブリのクラスを使用しているため(ソースコードは利用できません)、コードを変更することはできません。明示的なキャスト演算子の拡張メソッドを追加する必要がありますが、それを実現する方法はありますか?(通常の拡張メソッドとして追加しようとしましたが、成功しませんでした)

 public static explicit operator MembershipUser(this MembershipUser membership, User user)
    {
        return new MembershipUser("SimplyMembershipProvider", user.UserName, user.UserId, user.Email, null, null, user.IsApproved, user.IsLocked,
            user.CreateDate, user.LastLoginDate, user.LastActivityDate, user.CreateDate, DateTime.MinValue);
    }

どうすればこれを解決できますか?

4

4 に答える 4

14

拡張メソッドを介して演算子をオーバーロードすることはできません。

拡張メソッドでできる最善のこと:

public static MembershipUser ConvertToMembershipUser(this User user)
{
    return new MembershipUser("SimplyMembershipProvider", 
                              user.UserName, 
                              user.UserId, 
                              user.Email, 
                              null, 
                              null, 
                              user.IsApproved, 
                              user.IsLocked,
                              user.CreateDate, 
                              user.LastLoginDate, 
                              user.LastActivityDate,
                              user.CreateDate, 
                              DateTime.MinValue);
}

MembershipUser membershipUser = aUser.ConvertToMembershipUser();
于 2011-11-29T06:12:47.983 に答える
6

他の人が言ったように、拡張メソッドを使用して演算子をオーバーロードすることはできませんが、単純な拡張メソッドは引き続き役立ちます。

public static MembershipUser ToMembershipUser(this User user)
{
    return new MembershipUser("SimplyMembershipProvider",
        user.UserName, user.UserId, user.Email, null, null, 
        user.IsApproved, user.IsLocked, user.CreateDate, 
        user.LastLoginDate, user.LastActivityDate, user.CreateDate,
        DateTime.MinValue);
}

次に、次のように使用します。

User user = ...;
MembershipUser membershipUser = user.ToMembershipUser();

個人的には、とにかく明示的な変換を使用するよりもこれの方が明確だと思います.演算子のオーバーロードを行うことはめったにありません. 特に、クラスが確かに関連しているように見えることを考えると、素朴ユーザーは次のコードを期待するかもしれません。

User user = ...;
MembershipUser membershipUser = (MembershipUser) user;

MembershipUser... から派生したクラスであることを期待して、通常の参照変換になりますUser。これは、オブジェクトの同一性という点で重要です。その場合、関連するオブジェクト変更されません (また、 によって参照されるオブジェクトへの変更は、 によってuser引き続き表示されますmembershipUser)。

メソッドを作成するToMembershipUserと、あるフォームから別のタイプの新しいオブジェクトに変換していることが明確になります。もちろん、すべてのIMOです:)

于 2011-11-29T06:18:28.123 に答える
2

いいえ、拡張子変換を追加することはできません。

関連する型のいずれかのソース コードを管理している場合にのみ、明示的または暗黙的な変換を定義できます。あなたの場合は、 または のいずれMembershipUserかを制御できUserます。両方を制御する必要はありません。ただし、いずれかを制御する必要があります。

どちらも制御しない場合は、そのような変換を制御する役割を持つ他のクラスのメソッドで変換を定義するだけで済みます。

class UserConverter 
{
    public MembershipUser ConvertFrom(User user) 
    {
        return ...
    }
}
于 2011-11-29T06:12:43.813 に答える
1

これが良い習慣であるとは言わないでください (これを望まない理由については他の回答を読んでください。ただし、クラスがシールされていない場合は、拡張メソッドを使用しないだけで可能です)。

基本的に、次のようなキャスト演算子を定義するユーザーを継承するサロゲート クラスを作成できます。

    class UserSurrogate : User
    {
        public static explicit operator UserSurrogate(MemberShipUser other)
        {
            return  new UserSurrogate() { Name = other.Name };
        }
    }

    class User
    {
        public string Name { get; set; }
    }

    class MemberShipUser
    {
        public string Name { get; set; }   
    }
于 2011-11-29T06:40:09.310 に答える