3

重複の可能性:
.NET 4.0 (C#) でインターフェイスを動的に実装する
と、匿名型がインターフェイスにキャストされますか?

匿名型を特定のインターフェイスに「キャスト」する方法はありますか? このインターフェイスを実装するクラスを作成できることはわかっていますが、このクラスは必要ありません。インターフェイスを返す必要があります。

サードパーティのライブラリを使用しないソリューションが必要です

ありがとう、

var result =
    (from a in context.TABLE1
     join b in context.TABLE2 on a.Table2Id equals b.Id
     select new
     {
         Table1Field1 = a.Field1,
         Table2Field1 = b.Field1,
         ....
     }).ToList<IMyClass>();

public interface IMyClass
{
    string Table1Field1 { get; set; }
    string Table1Field2 { get; set; }
    string Table2Field1 { get; set; }
}
4

1 に答える 1

6

不可能だよ。なんで?匿名型は糖衣構文だからです。匿名型は設計時の機能であり、コンパイラが非常に奇妙な名前の実際の型を生成することを意味しますが、結局のところ、他の型と同じです。

残念ながら、C#にはインターフェイスの自動実装がありません。つまり、名前付きタイプでインターフェースを実装する必要があります。

アップデート

この制限を回避したいですか?

制御の反転を使用できます(Castle WindsorなどのAPIを使用するか、手動で使用します)。

私が今作ったこのサンプルコードをチェックしてください:

public static class AnonymousExtensions
{
    public static T To<T>(this object anon)
    {
        // #1 Obtain the type implementing the whole interface
        Type implementation = Assembly.GetExecutingAssembly()
                                .GetTypes()
                                .SingleOrDefault(t => t.GetInterfaces().Contains(typeof(T)));

        // #2 Once you've the implementation type, you create an instance of it
        object implementationInstance = Activator.CreateInstance(implementation, false);

        // #3 Now's time to set the implementation properties based on
        // the anonyous type instance property values!
        foreach(PropertyInfo property in anon.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            // Has the implementation this anonymous type property?
            if(implementation.GetProperty(property.Name) != null)
            {
                // Setting the implementation instance property with the anonymous
                // type instance property's value!
                implementation.GetProperty(property.Name).SetValue(implementationInstance, property.GetValue(anon, null));
            }
        }

        return (T)implementationInstance;
    }
}

いくつかのインターフェースを設計および実装します...

// Some interface
public interface IHasText
{
    string Text { get; set; }
}

// An implementation for the interface
public class HasText : IHasText
{
    public string Text
    {
        get;
        set;
    }
}

ここで、拡張メソッド全体をどこかで使用します。

var anonymous = new { Text = "Hello world!" };
IHasText hasTextImplementation = anonymous.To<IHasText>();

hasTextImplementationHasText実装インスタンスがあります!つまり、TextプロパティにはHello world!が含まれます。

このコードは、基本クラスと抽象クラスをサポートするために微調整できることに注意してください。ただし、必要に応じて、必要に応じて改善するための基本情報を取得するには、これで十分だと思います。

于 2012-11-21T09:26:01.317 に答える