-4

私はインターフェースを持っています:

public interface IBag
{
    public string BagName { get; }
}

クラスはそれから継承します:

 public class CacheBag : IBag
    {
        private Dictionary<string, object> cache;

        public Dictionary<string, object> Cache
        {
            get
            {
                return this.cache;
            }

            private set
            {
                this.cache = value;
            }
        }

        public string BagName
        {
            get { return "CacheBag"; }
        }
    }

インターフェイスから継承するクラスの拡張メソッドを作成しようとしています:

 public static object Retrieve(this IBag bag)
    {
        Type objType = bag.GetType();
        IBag obj = null;
        try
        {
            IsolatedStorageFile appStore = IsolatedStorageFile.GetUserStoreForApplication();
            string fileName = string.Format(CultureInfo.InvariantCulture, "{0}.xml", bag.BagName);
            if (appStore.FileExists(fileName))
            {
                using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(fileName, FileMode.Open, appStore))
                {
                    using (StreamReader sr = new StreamReader(isoStream))
                    {
                        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(objType);
                        obj = (IBag)x.Deserialize(sr);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            log.Error(ex.Message);
        }

        return obj;
    }
}

しかし、今では次のように機能しました。

UserBag users = new UserBag();
                    users.Retrieve();

次のような拡張機能を呼び出すことができます。

        CacheBag.Retrieve();

それを達成するために実装をどのように変更すればよいですか?

4

1 に答える 1

2

クラスのインスタンスで拡張メソッドを呼び出すことができるはずです。

CacheBag bag = new CacheBag();
object result = bag.Retrieve();

拡張メソッドを呼び出すには、クラスのインスタンスが必要です。ショートカットとして、次のように書くことができます:

object result = new CacheBag().Retrieve();

ただし、インスタンスを作成したくない場合は、拡張メソッドは必要ありません。通常の静的メソッドを定義する必要があります。

于 2012-09-23T15:34:14.463 に答える