Come richiamare un metodo in una classe sempre quando si accede alla classe - come una reazione? [duplicare]

2

Sto lavorando a un progetto di micro quadro C # net, in particolare una classe di bus I2C.

Ho diversi dispositivi I2C diversi definiti in classi separate che contengono tutti i metodi unici dei dispositivi. Nel mio caso, posso avere un solo oggetto I2CDevice definito e passare a un altro dispositivo I2C, devo cambiare I2CDevice.Config = DeviceConfig.

Ad esempio (pseudo-codice):

Class Device1 
-DeviceConfig1
-Method 1
-Method 2
-Method 3

Class Device2
-DeviceConfig2
-Method 1
-Method 2
-Method 3


Main Program
{
I2cBus = new I2CDevice(configuration)
Device1.Method1
Device2.Method3
}

Quando si passa da un dispositivo all'altro, è necessario modificare la proprietà I2CDevice.Config. Sto cercando un modo elegante in modo tale che ogni volta che chiamo un metodo per un dispositivo, che l'I2CBus.Config venga modificato automaticamente. C'è un modo in cui non ho bisogno di ri-digitare questo codice di configurazione in ogni metodo? Hai un metodo interno separato che viene chiamato ogni volta che accedo a uno di questi metodi?

Spero che la mia descrizione sia chiara.

Aggiornamento, In alternativa, c'è un modo in cui posso fare la mia classe I2C Bus e poi AGGIUNGERE i dispositivi in questa classe? Quindi per accedere ai dispositivi, farei qualcosa di simile

I2CBus.AddDevice(Device1ObjectClass)
I2CBus.AddDevice(Device2ObjectClass)
I2CBus.Device1.Method1
I2CBus.Device2.Method2

Ho ancora lo stesso problema di cui ho bisogno per "automaticamente" cambiare la configurazione I2C tra le chiamate di dispositivi diversi.

    
posta GisMofx 20.03.2014 - 21:28
fonte

2 risposte

1

Forse:

class DeviceWrapper
{
   private Device1 _device1;
   public Device1 device1
   {
      get
      {
           happensEveryTimeDeviceIsAccessed();
           return _device1;

       }
   } 
}
    
risposta data 20.03.2014 - 22:47
fonte
0

Questo è il meglio che ho potuto inventare, e non ho paura di ammettere che è spazzatura perché non sei ancora in grado di avere il tuo I2CBus a conoscenza intrinseca di cosa fare. È tipo di funziona ma, come ho detto, è tutto ciò che ho.

public interface IDevice
{
    string Name { get; set; }
    DeviceConfiguration GetConfiguration();
}

public abstract class DeviceParent : IDevice
{
    public DeviceParent(DeviceConfiguration aConfig)
    {
        myConfig = aConfig; 
    }

    #region IDevice Members

    public string Name { get; set; }

    public virtual DeviceConfiguration GetConfiguration() //This could also simply be a property, not sure what you want to do with it.
    {
        return myConfig;
    }

    #endregion

    protected DeviceConfiguration myConfig;

}

public class DeviceConfiguration
{
    public DeviceConfiguration()
    {

    }
}

public class Device : DeviceParent
{
    public Device(DeviceConfiguration aConfig) : base(aConfig) { }

    public void SomeMethod()
    {

    }
}

public class Device2 : DeviceParent
{
    public Device2(DeviceConfiguration aConfig) : base(aConfig) { }

    public void SomeMethod2()
    {

    }
}

public class I2CBus : IEnumerable<IDevice>
{

    private List<IDevice> myDevices;
    private DeviceConfiguration currentConfiguration;

    public enum NonExistantDeviceBehaviour
    {
        ReturnNull,
        AddToOurselves
    }

    public NonExistantDeviceBehaviour NoDeviceBehaviour; //Defines what should happen in the event that we're indexed by a device that we don't contain yet.

    public IDevice this[IDevice index]
    {
        get
        {
            if (!myDevices.Exists(d => d.Name == index.Name))
            {
                switch (NoDeviceBehaviour)
                {
                    case NonExistantDeviceBehaviour.ReturnNull:
                        return null;
                    case NonExistantDeviceBehaviour.AddToOurselves:
                        myDevices.Add(index);
                        break;
                }
            }

            currentConfiguration = index.GetConfiguration();

            return myDevices.Find(d => d.Name == index.Name);

        }
    }


    public I2CBus()
    {
        currentConfiguration = null;
        myDevices = new List<IDevice>(); //Ensures our list is never null
    }


    #region IEnumerable<IDevice> Members

    public IEnumerator<IDevice> GetEnumerator()
    {
        return myDevices.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    #endregion
}

Quindi tutto ciò che ho fatto è stato aggiungere l'indice alla classe I2CBus , che consente di utilizzare questa sintassi:

I2CBusInstance[Device1]

Tuttavia, devi comunque trasmettere al tipo che stai passando a quell'indice per ottenere comunque l'accesso ai metodi di quel tipo, motivo per cui questa soluzione non è l'ideale. Ecco l'utilizzo:

I2CBus i2cb = new I2CBus();

Device device = new Device(new DeviceConfiguration());
Device2 device2 = new Device2(new DeviceConfiguration());

i2cb.NoDeviceBehaviour = I2CBus.NonExistantDeviceBehaviour.AddToOurselves;

(i2cb[device] as Device).SomeMethod();

Spero che questo aiuti un po '... Vedrò questa domanda un po' perché sono incredibilmente incuriosito ora.

    
risposta data 25.03.2014 - 21:09
fonte

Leggi altre domande sui tag