0

プログラムで入力するListView(WPFアプリ内)があります。

l1.Items.Add(new
{
    AA = aa++,
    Description = descriptions[k],
    Shop = names[k + 2],
    Price = price
});

最初の行と列の価格の値を取得したいと思います。私はオブジェクトを取ることができます

object b = l1.Items.GetItemAt(0);

しかし、私はその代償を払うことができません。

4

7 に答える 7

5

dynamicそのためのキーワードを使用できます。

dynamic b = l1.Items.GetItemAt(0); 
var price = b.Price;
于 2012-07-25T12:57:26.083 に答える
4

匿名オブジェクトがスコープ外になると、リフレクション(推奨されません)、動的(コンパイル時の型の安全性が失われる)、またはその他のハックを使用してのみ、そのプロパティにアクセスできます。

最もクリーンな解決策は、匿名でないオブジェクトを使用することです。つまり、クラスを定義することです。

public class MyData {
    public int AA { get; set; }
    public string Description { get; set; }
    ...
}

...

l1.Items.Add(new MyData { AA = aa++, Description = descriptions[k], ...});

...

MyData b = (MyData) l1.Items.GetItemAt(0);
int aaValueOfB = b.AA;
于 2012-07-25T12:57:42.467 に答える
2

dynamicこの機能は、C#4で次のように使用できます。

dynamic item = l1.Items.GetItemAt(0);
double price = item.Price;

リフレクションを使用することもできます(ダイナミックはとにかくカバーの下で使用します):

object item = l1.Items.GetItemAt(0);
Type t = item.GetType();
PropertyInfo pi = item.GetProperty("Price");
object price = pi.GetValue(item, null);

または、アプリケーションで意味がある場合は、通常のクラスとして宣言し、そのように使用します。

于 2012-07-25T12:57:26.473 に答える
2

一度入ったらobject、キャストすることはできません。2つのオプションがあります。

  • キーワードを使用してdynamic、値をダックタイピングします。

    dynamic d = l1.Items.GetItemAt(0);
    var price = d.Price;
    
  • 匿名タイプの代わりに実際のクラスを使用してください。

個人的に、私はクラスを作ります:

public class ItemsModel
{
    // Define the properties, etc.
}

INotifyPropertyChangedデータバインドするために実装したいと思うかもしれません。

于 2012-07-25T12:58:33.527 に答える
2

すでに言ったように、C#の動的キーワードを使用できます。別のオプション(オブジェクト構造がわかっている場合)は、リフレクションを使用して関連するプロパティを取得し、その値を抽出することです。

List<object> collection = new List<object>
{
    new { Age1 = 1, Name = "Mr. Someone" } 
};            

// you can use reflection
object anonymous = collection.First();
var parameterInfo = anonymous.GetType().GetProperty("Name");
string name1 = (string)parameterInfo.GetValue(anonymous, null);

// another way
dynamic dynamicObject = collection.First();
string name2 dynamicObject.Name;
于 2012-07-25T13:01:46.537 に答える
0

これを試して:

private static T GetAnonType<T>(T type, object obj)
        {
            return (T)obj;
        }

Object obj= l1.Items.GetItemAt(0);

var info = GetAnonType(new { AA = aa++, Description = descriptions[k], Shop = names[k + 2], Price = price},obj);

AA、Descriptionなどの引数にはデフォルト値を使用します。

info.AA, info.Priceその後、などを使用できます。

于 2012-07-25T13:12:09.863 に答える
0

私は匿名型を初めて使用しますが、オブジェクトをその型にキャストする必要があります。

private static T CastTo<T>(this Object x, T targetType)
{
    return (T)x;
}
...
var tmp = new { AA = 0, Description = "", Shop = "", Price = 0.0}
tmp = l1.Items.GetItemAt(0).CastTo(tmp);
string price= "Price = " + tmp.Price;

tmpプロパティが正しいタイプで初期化されることを確認してください。

于 2012-07-25T13:18:04.797 に答える