Pregunta ¿Cómo combinar un objeto de clase parcial en C #?


Definí una clase:

public class Sample{
    public string name {get;set;}
    public int price {get;set}
}

Entonces

 Sample sampleA = new Sample();
 sampleA.name = "test";

  Sample sampleB = new Sample();
  sampleB.price = 100;

Lo hago porque guardaré JSONed sampleA y JSONed sampleB en la tabla Azure, para presentar un objeto de muestra completo. En otro código, en algún momento solo necesito el nombre, a veces solo necesito precio, por lo que solo necesito extraer los datos que necesito cada vez. Por supuesto, en el código real, la estructura de la muestra es mucho más compleja.

Mi pregunta es:, ¿hay algún método fácil que puede hacer:

  Sample sampleC = sampleA + sampleB;

y sampleC debe contener:

 sampleC.name = "test";
  sampleC.price = 100;

5
2017-12-11 17:56


origen


Respuestas:


¿Qué tal si solo sobrecargas el +  operator ?

    public static Sample operator +(Sample left, Sample right)
    {
        left.price = right.price;
        return left;
    }

4
2017-12-11 18:07



Esto no tiene nada que ver con las clases parciales. La clase parcial es una clase única, que se declara "geográficamente" más que en un archivo.

File1.cs:

public partial class File { public string Prop2 { get;set; } }

File2.cs:

public partial class File { public int Prop1 { get;set; } }

que, cuando se compile, producirá:

public partial class File 
{
     public string Prop2 { get;set; } 
     public int Prop1 { get;set; } 
}

Por lo que pides.
No existe tal método, que combine dos instancias diferentes en una. Deberías escribirlo por tu cuenta.

ACTUALIZAR:
Usted puede preguntar, por qué no hay tal método. Pero, ¿cómo manejaría la situación como:

Sample sampleA = new Sample();
sampleA.name = "test";
sampleA.price = 200;

Sample sampleB = new Sample();
sampleB.price = 100;

Sample sampleC = sampleA + sampleB; // what would be the value of price here: from sampleA or sampleB?

6
2017-12-11 18:01



Puedes lograr esto sobrecargando el operador + en tu clase. Algo como esto

public static Sample operator +(Sample sampleA, Sample sampleB){
    return new Sample() { Name = sampleA.Name, Price = sampleB.Price };
}

2
2017-12-11 18:07



Como Eric Yin mencionó en su respuesta, clase parcial es un nombre inapropiado de usar ya que se refiere a algo completamente diferente.

Es posible dividir la definición de una clase o una estructura, una   interfaz o un método sobre dos o más archivos fuente. Cada archivo fuente   contiene una sección del tipo o definición de método, y todas las partes son   combinado cuando se compila la aplicación.

En primer lugar, debe considerar si utilizar el operador de adición sería una buena opción desde el punto de vista conceptual. ¿Es obvio / u ambiguo cuál será el objeto resultante?

A primera vista, interpretaría el comportamiento que está buscando como la combinación de dos objetos al usar todos sus valores no nulos. Cuando ambos objetos tienen el mismo campo con un valor no nulo, ¿cómo manejaría eso?

Teniendo en cuenta que este es el comportamiento que está buscando, podría sobrecargar el operador de adición como en la respuesta de Gabe. Cuando su clase / estructura solo contiene valores anulables, puede dejar que la adición copie todos los valores de un objeto al otro donde uno contiene un valor y el otro un null valor. Lanzaré una excepción cuando ambos objetos contengan un valor.

Como último punto, reflexione sobre cómo terminó teniendo que implementar este comportamiento. Es mi conjetura que hay una problema de diseño subyacente usted podría dirigirse en su lugar. Probablemente no deberías usar objetos que solo almacenan datos parciales.


Como otra alternativa la nueva. palabra clave dinámica en C # también viene a la mente. Puede que valga la pena echarle un vistazo también.


0
2017-12-11 18:34