0

私はこのコードを書いています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net.Mail;
using System.Net;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Foo m_oFoo = new Foo() { 
            S1 = "N"
        };

        List<Foo> m_List = new List<Foo>();
        m_List.Add(m_oFoo);

        IFoo m_oIFoo = (IFoo)m_List[0];
        m_oIFoo.S2 = "C";

        Response.Write(m_oIFoo.S1);
        Response.Write(m_oIFoo.S2);
    }
}

public class Foo
{
    public string S1 { get; set; }
    public Foo()
    {

    }
}

public class IFoo: Foo
{
    public string S2 { get; set; }
    public IFoo(){}
}

しかし、コンパイラは、「タイプ 'IFoo' でタイプ 'Foo' のオブジェクトをキャストできません」と言っています。これは例であるため、すべての Foo メソッドでキャスターを宣言せずに Foo を Foo1 にキャストする方法は、Foo には 100 以上のメソッドがあります。

助けてくれてありがとう

4

6 に答える 6

2

Foo を Foo1 にキャストする方法

できません。これまで。オブジェクトは実際にはFooではなくオブジェクトであるIFooため、キャストは成功しません。オブジェクトを「変換」する必要がありますが、これはまったく別のことです。IFooインスタンスで提供されるデータに基づいて、新しいオブジェクトを作成する必要がありFooます。これを行う 1 つの方法は、オブジェクトIFooを受け入れるコンストラクターを使用することです。Foo

public class IFoo: Foo
{
    public string S2 { get; set; }
    public IFoo(){}
    public IFoo(Foo other)
    {
        S1 = other.S1;
    }
}

次に、次のことができます。

IFoo m_oIFoo = new IFoo(m_List[0]);
于 2013-03-11T17:04:38.663 に答える
0

基本クラスをその派生 (拡張) クラスの 1 つにキャストすることはできません。一般的なクラスの拡張プロセスについて考えると、これは非常に直感的です。クラスを拡張するとき、拡張されたクラスは基本クラスには存在しないメンバーを追加する可能性があるため、コンパイラがキャストを許可すると、悲惨なことが起こる可能性があります!

于 2013-03-11T17:02:26.527 に答える
0

申し訳ありませんが、組み込みの方法はありません。最善の策は、リフレクションを使用して両方のクラスに存在するすべてのプロパティを取得し、そのように値を設定するか、オブジェクトをシリアル化してから別の型に逆シリアル化することです。

どちらの方法も完璧ではありません。

于 2013-03-11T17:02:51.103 に答える
0

基本クラスをサブクラスにキャストすることはできませんが、 変換演算子を使用して同様のことを行うことができます。

public class IFoo: Foo
{
    ...

    public static explicit operator IFoo(Foo foo)  // explicit byte to digit conversion operator
    {
        ...
    }
}
于 2013-03-11T17:03:03.483 に答える
0

基本クラスから派生クラスにキャストすることはできません。代わりに、コンバーターを作成し、 AutoMapperexplicitを使用してすべてのプロパティをマップしてみてください。

于 2013-03-11T17:05:39.380 に答える
-1

まず第一に、通常はインターフェイスに使用されるクラスで大文字の I を使用しないでください。第 2 に、IFoo は Foo を継承するため、「上向き」にキャストすることはできません。その逆ではありません。

このように考えてみてください: IFoo は Foo ですが、その逆ではありません。

ただし、これを次のように書き換えることができます。

IFoo m_oIFoo = m_List[0] as IFoo; // this might be null now
if (m_oIFoo != null)
{
    m_oIFoo.S2 = "C";

    Response.Write(m_oIFoo.S1);
    Response.Write(m_oIFoo.S2);
}

キャストにはas演算子を使用しますが、null を返す可能性があることに注意してください。

于 2013-03-11T17:04:54.480 に答える