2012-05-24 7 views
1

J'ai un objet comme celui-ciRéflexion, dynamique. Comment remplacer un objet par un autre?

public class Simple 
{ 
    public string Value 
    { 
     get { return GetProperty(); } 
    } 

    // different methods, fields, events, etc. 
} 

possible de remplacer instance de la classe simple avec un objet égal, mais avec setter?

Comment mettre en œuvre ...

private object Substitution(object simple) 
{ 
    object newSimple; 

    // implementations 

    newSimple.Value = "data"; 
    return newSimple; 
} 

avoir quelque chose comme ce

public class Simple 
{ 
    public string Value { get; set; } 

    // my methods, fields, events ... 
} 

Je pensais créer une classe et d'hériter de Systemobject, vous pouvez créer des propriétés dynamiques, mais pourrait not do :(

Ou peut-être essayer d'hériter de cet objet (comment?) et remplacer les propriétés?

Merci

+1

Quel est votre objectif ici? –

Répondre

0

Vous ne pouvez pas modifier la définition ou la structure d'un type chargé lors de l'exécution.

Vous pouvez, potentiellement, créer un nouveau type qui avait un ensemble similaire de propriétés et de champs, avec l'accesseur de propriété ajouté. Cependant, dans la plupart des cas, cela sera d'une utilité limitée, car le code existant ne comprendra pas le nouveau type (puisqu'il est généré à l'exécution), donc il fonctionnera encore avec le type existant, qui ne sera pas compatible.

En règle générale, si vous avez besoin d'extensibilité d'exécution dans un type, il existe d'autres options, y compris au moyen d'un Dictionary<T,U> ou dynamic avec ExpandoObject, ou un autre mécanisme pour stocker des informations « supplémentaires » dans une classe qui n'est pas connu au moment de la compilation .

0

Vous pouvez toujours utiliser une interface qui ne définit qu'un getter de propriété. Ensuite, dans la mise en œuvre ont un setter de la propriété?

class Program 
{ 
    static void Main(string[] args) 
    { 
     IMyClass myA = new ClassA{ Property = "Class A" }; 

     Console.WriteLine(myA.Property); 

     // can't do this 
     // myA.Property = "New Property"; 

     // can do this 
     (myA as ClassA).Property = "New Property"; 
     Console.WriteLine(myA.Property); 
    } 
} 

interface IMyClass 
{ 
    string Property { get; } 
} 

class ClassA : IMyClass 
{ 
    public string Property { get; set; } 
} 

A défaut, vous pouvez faire une conversion définie par l'utilisateur en utilisant le mot-clé explicite, more info at MSDN

Questions connexes