5

このような:

    public class remoteStatusCounts : RemoteStatus 
{
    public int statusCount;

    public remoteStatusCounts(RemoteStatus r)
    {
        Type t = r.GetType();
        foreach (PropertyInfo p in t.GetProperties())
        {
            this.property(p) = p.GetValue(); //example pseudocode
        }
    }
}

この例は少し単純ですが(Jira APIからのものです-RemoteStatusには4つのプロパティがあります)、基本クラスに30のプロパティがあると想像してください。特に、継承されたクラスに2、3の追加プロパティしかない場合は、これらすべての値を手動で設定したくありません。

振り返りは答えをほのめかしているようです。

コンストラクターでの継承の使用(publix X():y)で、基本クラスのコンストラクターを呼び出すことができることを確認しました(間違っている場合は修正してください)が、基本クラスにはコンストラクターがありません。 jira wsdl

        public remoteStatusCounts(RemoteStatus r) : base(r) { //do stuff }

編集 私は2つの有効な解決策を想像することができます:上で概説したものと、そのようなある種のキーワードthis.baseClassは、そのようtype(baseclass)に操作され、の一種のポインタとして機能しますthis。だから、this.baseClass.name = "Johnny"まったく同じことになるでしょうthis.name = "Johnny"

すべての目的と目的のために、基本クラスにコピーコンストラクターがあると仮定しましょう。つまり、これは有効なコードです。

        public remoteStatusCounts(RemoteStatus r) {
            RemoteStatus mBase = r;
            //do work
        }

edit2 この質問は、実際的な質問というよりも思考演習です。私の目的では、これを同じように簡単に行うことができます:(私の「ベースクラス」がコピーを作成できると仮定して)

    public class remoteStatusCounts 
{
    public int statusCount;
    public RemoteStatus rStatus;
    public remoteStatusCounts(RemoteStatus r)
    {
        rStatus = r;
        statusCount = getStatusCount();
    }
}
4

2 に答える 2

2

AutoMapperを試してください。

于 2010-06-18T19:36:18.250 に答える
1

はい、これを行うことができます-ただし、個別に処理する必要があるゲッターのみのプロパティに遭遇する可能性があることに注意してください。

オーバーロードでフィルタリングできますType.GetProperties(BindingsFlags)

注:リフレクションは実行速度などの実行時の影響を与える可能性があるため、おそらくコード生成を検討する必要があります(T4はvs 2008/2010で提供されるため、アイデアになります)。コード生成を使用すると、この面倒な作業を簡単に処理でき、手動で入力するのと同じランタイムなどを維持できます。

例:

//extension method somewhere
public static T Cast<T>(this object o)
{
    return (T)o;
}

public remoteStatusCounts(RemoteStatus r)
{
    Type typeR = r.GetType();
    Type typeThis = this.GetType();

    foreach (PropertyInfo p in typeR.GetProperties())
    {
        PropertyInfo thisProperty = typeThis.GetProperty(p.Name);

        MethodInfo castMethod = typeof(ExMethods).GetMethod("Cast").MakeGenericMethod(p.PropertyType);
        var castedObject = castMethod.Invoke(null, new object[] { p.GetValue(r, null) });
        thisProperty.SetValue(this, castedObject, null);
    }
}
于 2010-06-18T19:31:52.203 に答える