3
[Serializable]
public abstract class A
{
    public A()
    {

    }
}

[Serializable]
public class B : A
{
    public B() : base()
    {

    }
}

拡張機能では:

public static T NextRecord<T>(this SqlDataReader reader) where T : A, new()
{
    // Do work
}

この拡張機能を次のように呼び出します。

B b = reader.NextRecord<B>();

それでも、「'B' から 'A' への暗黙的な参照変換はありません」という例外が発生します。

私は何を間違っていますか?

ありがとう。

編集

public static T NextRecord<T>(this SqlDataReader reader) where T : A, new()
{
    // Make sure we have been given a correct Type
    if (!typeof(T).BaseType.Equals(typeof(A)))
    {
        throw new Exception("Supplied Type is not derived from Type A");
    }

    if (reader.IsNull())
    {
        throw new ArgumentNullException("reader is null");
    }

    if (reader.HasRows)
    {
        if (reader.Read())
        {
            // Instance a object of the type, passing it the SqlDataReader so that it can populate itself   
            return Activator.CreateInstance(typeof(T), new object[] { reader }) as T;
        }
    }

    return null;
}

拡張機能のコードはこちら

4

1 に答える 1

0

これにはまだ問題がありますが、 where T : A を where T : class に変更することで問題を修正しました。

2番目の問題があります:

public class SomeOtherClass
{
    public static void Test(SomeClassBase obj)
    {

    }
}

public abstract class SomeClassBase
{
    public SomeClassBase()
    {
        SomeOtherClass.Test(this);
    }
}

public class SomeClass : SomeClassBase
{
    public SomeClass() : base()
    {

    }
}

私はこの例外を取得します:

「「Namespace.SomeOtherClass.Test(Namespace.SomeClass)」に最適なオーバーロードされたメソッドの一致には、無効な引数がいくつかあります」

ただし、メソッド呼び出しを ctor から削除して外部で呼び出すと、次のように機能します。

SomeClass s = new SomeClass(); SomeOtherClass.Test(s);

メソッドを次のように変更しても:

public static void Test(SomeClass obj)
{

}

失敗します:(

メソッド呼び出しを派生クラス ctor に移動すると...

于 2012-06-20T23:25:26.353 に答える