0

拡張可能な一連のプロパティ (それぞれが RatingProperty) を持つアプリを作成しています。また、すべての動的プロパティが RatingProperty タイプであることを検証したいと考えています。

Expando のドキュメントには次のように書かれています。

ヒント: Property クラスを使用して動的プロパティ値を検証する場合は、Property クラスをインスタンス化し、値に対してその validate() メソッドを呼び出すことができます。

したがって、動的プロパティを検証したい場合は、クラスの非動的プロパティが何であるかを知る必要があります。クラスに定義されているプロパティを尋ねるにはどうすればよいですか?

文字列を受け取り、その文字列が私が作成および管理するプロパティ名のリストに含まれている場合に true を返すクラス メソッドを作成することを検討しましたが、ハックのようです。Google でヒントを検索しましたが、うまくいきませんでした。

ありがとう、パット

4

4 に答える 4

1

After a bit more research (damn you lazyweb!) I've found a solution that I think is acceptable:

A dynamic property can't be of a db subclassed property type. Thus, there are two distinct steps that must be taken. First you need to create an instance of your property class and validate your value:

test = db.RatingProperty()
if test.validate(valueToSave):
    #do your thing

Next you need to check if the property you want to save is a declared property:

if valueToSaveKey not in myObject.properties():
    #if not save it as desired
    myObject.valueToSaveKey = valueToSave

The down side here is that the value you save isn't stored as the property type you want.

于 2009-01-07T01:51:44.380 に答える
1

http://code.google.com/appengine/docs/python/datastore/modelclass.html#Model_properties

db.Model には、インスタンスのすべてのプロパティを見つけるメソッドがあります。

このクラスは、Property オブジェクトのリストを公開します: db.Model.properties()

インスタンスは動的な名前のみを公開します: instance.dynamic_properties()

リストをループして Property オブジェクトを作成し、p.validate() を実行します。

for p_name in instance.dynamic_properties():
    p = db.RatingProperty()
    p.validate() # raises BadValueError, etc.
于 2011-12-02T16:41:17.270 に答える
0

実はとても簡単です!

ExpandoObjectは実装され(IDictionary<String, Object>)ているので、これを行う必要があります:

 dynamic person = new ExpandoObject();
 person.FirstName = "Barack";
 person.LastName = "Obama"

 (((IDictionary<String, Object>)person).Keys  
    => { "FirstName", "LastName" }

 (((IDictionary<String, Object>)person).ContainsKey("FirstName")  
    => true

注:(IDictionary<string, object>ExpandoObjectはこのインターフェースを明示的に実装しているため、明示的にキャストする必要があります。インスタンス自体にはまたはがありませContainsKey()Keys

このメソッドがすべての動的オブジェクトで機能することを期待しないでください。ExpandoObjectとこのインターフェイスを実装するその他のものだけです。

于 2010-12-22T00:45:30.260 に答える