拡張メソッドと明示的なキャスト
-
25-10-2019 - |
質問
私はいくつかのアセンブリのクラスを使用しています(ソースコードは利用できません)。そのため、明示的なキャストオペレーターに拡張メソッドを追加する必要があるコードを変更することはできませんが、それを達成する方法はありますか? (私は通常の拡張方法として追加しようとしましたが、成功せずに)
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);
}
どうすればこれを解決できますか?
解決
拡張メソッドを介してオペレーターを過負荷することはできません。
拡張メソッドでできる最善の方法:
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();
他のヒント
他の人が言ったように、拡張法を使用してオペレーターを過負荷することはできませんが、単純な拡張方法はまだ役立ちます。
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 :)
いいえ、拡張変換を追加することはできません。
明示的または暗黙的な変換は、関連するタイプの1つのソースコードを制御する場合にのみ定義できます。あなたの場合、どちらも制御できます MembershipUser
また User
, 、両方を制御する必要はありません。しかし、あなた しなければならない 1つを制御します。
どちらも制御しない場合は、そのような変換を制御することが仕事である他のクラスの方法で変換を定義する必要があります。
class UserConverter
{
public MembershipUser ConvertFrom(User user)
{
return ...
}
}
これが良い習慣であると言っているのではありません(なぜこれを望んでいないのかについて他の答えを読んでください。しかし、クラスが封印されていない場合、これは可能であり、拡張方法を使用しないでください)。
基本的に、キャスティングオペレーターを定義するユーザーを継承するサロゲートクラスを作成できます。
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; }
}