不可能だよ。なんで?匿名型は糖衣構文だからです。匿名型は設計時の機能であり、コンパイラが非常に奇妙な名前の実際の型を生成することを意味しますが、結局のところ、他の型と同じです。
残念ながら、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>();
hasTextImplementation
HasText
実装インスタンスがあります!つまり、Text
プロパティにはHello world!が含まれます。。
このコードは、基本クラスと抽象クラスをサポートするために微調整できることに注意してください。ただし、必要に応じて、必要に応じて改善するための基本情報を取得するには、これで十分だと思います。