2012-02-26 7 views
0

私は基本的にExpandoObjectであるWebサーバーコントロールを作成する方法を理解しようとしています。System.Dynamic ExpandoControlは可能ですか?

コントロールがaspxマークアップで作成されたときに、プロパティを自動的に作成することが望まれます。例えば

:someProperty属性はまだコントロールのプロパティとして存在しません

<x:ExpandoControl someProperty="a value"></x:ExpandoControl> 

私は、ControlまたはWebControlの機能を厳密に必要としないことにも言及する必要があります。私はちょうどrunat = "server"でマークアップで宣言できるようにする必要があります(少なくともそれは私が思っていることです)。

可能ですか?もしそうなら、私はどのように始めることができますか?

多くのありがとうございます。

答えて

1

私はあなたの最初の賭けがIAttributeAccessorを実装することだと思う:

public interface IAttributeAccessor 
{ 
    string GetAttribute(string key); 
    void SetAttribute(string key, string value); 
} 

ASP.NETページパーサーは、それがパブリックプロパティにマップすることはできません属性ごとにIAttributeAccessor.SetAttributeを呼び出します。

だから、おそらくあなたは

public class ExpandoControl : Control, IAttributeAccessor 
{ 
    IDictionary<string, object> _expando = new ExpandoObject(); 

    public dynamic Expando 
    { 
     { 
      return _expando; 
     } 
    } 

    void IAttributeAccessor.SetValue(string key, string value) 
    { 
     _expando[key] = value; 
    } 

    string IAttributeAccessor.GetValue(string key) 
    { 
     object value; 
     if (_expando.TryGetValue(key, out value) && value != null) 
      return value.ToString(); 
     else 
      return null; 
    } 
} 
+0

ブリリアントで始めることができます!私はかなり前にこのインタフェースについて読むことを覚えていますが、それを忘れてしまっています。あなたが正しいと思います。それはちょうど私がそれに必要な方法で動作するかもしれません。助けてくれてありがとう。私は今晩後にそれを試してみる機会があるとき、これを受け入れられた答えとして更新します。 – ChrisS

+0

これは実際に動作します。唯一の制限は、値が文字列値でなければならないという事実ですが、いくつかの巧妙なシリアライゼーションとデシリアライゼーションが必要です。 – ChrisS

関連する問題