1

いくつかの観察可能なコレクションにバインドされたビュー(リストビューで構成されています)があります。言い換えれば、私は持っています:

var someCollection = new ObservableCollection<ClassFoo>();
// initialize someCollection

ListView someView = new ListView();
someView.DataContext = someCollection;
someView.ItemsSource = someCollection;

ノート:

  • someViewProject1.dllProject2.dllsomeCollectionにあります
  • Project2.dllにはProject1.dllへ参照があり、Project1.dllにはProject2.dllへの参照がありません

したがって、私の見解では、Project2.dllへの参照を追加する必要があるためObservableCollection<object>、実際のタイプの場所にコンパイルエラーが発生するため、タイプのsomeCollectionへの参照があります。ObservableCollection<ClassFoo>

なんらかの理由でその参照を追加できず、上司からコマンドなどを作成してほしいとのことです。


最後の部分は、なぜ私がこれをやりたいのかを説明しているだけですが、要するに私は探しています:

  ObservableCollection<object> myUnknownObservableCollection = someReference;
  // I know that someReferce is of type ObservableCollection<ClassFoo>
  var x = myUnknownObservableCollection.GetType().GetTypeOfItems.....

typeof(ClassFoo)最後に、someReferenceがタイプである場合、xをリフレクションでどのように実行できるかと等しくしたいと思いObservableCollection<ClassFoo>ます。


編集

私は解決策を得ました!ここにあります:

    class Person 
    {
        public string Name { get { return "Antonio"; } }
    }

    .. 

    // view code:

    IEnumerable<object> uncknownObject;

    // view model does this:
    uncknownObject = new ObservableCollection<Person>( );

    // continuation of view code:

    var observCol = uncknownObject.GetType( );

    var x = ( ( dynamic )observCol ).GenericTypeArguments[ 0 ]; 

    var instance = ( Person )Activator.CreateInstance( x );

    Console.WriteLine( instance.Name ); // Print Antonio!!!

ただし、動的データ型がなくても実行できると便利です。


編集2

これは、動的タイプを使用せずに.net4.0を実行するソリューションです。

4

1 に答える 1

0

mvvmの使用を計画している場合、動的タイプはバインディングに役立ちません。SLaksが提案したようにインターフェースを使用する必要があるかもしれません

public interface IClassFoo
{
   string Name { get; }
}

public class ClassFoo : IClassFoo
{
    public string Name { get { return "Antonio"; } }
}

//Usage 
var someCollection = new ObservableCollection<IClassFoo>();
于 2013-02-25T05:14:12.327 に答える