Clase parcial en diferentes espacios de nombres

¿Puedo crear clases parciales en diferentes espacios de nombres? ¿Funcionará correctamente? ex:

class1.cs

namespace name1 { public partial class Foo { Bar1(){ return 10; } } } 

class2.cs

 namespace name1.name2 { public partial class Foo { Bar2(){ return 100; } } } 

main.cs

 using name1; using name1.name2; namespace mainClass { public class mainClass { Foo classFoo = new Foo(); int Count = classFoo.Bar1() + classFoo.Bar2(); // Will Count = 110? } } 

¿Qué debo hacer para que funcione? (si mi ejemplo no es correcto)

El nombre de una clase incluye su espacio de nombres, por lo que name1.Foo y name1.name2.Foo son dos tipos completamente separados. Entonces la respuesta corta a su pregunta es: No.

¿Por qué necesitas hacer algo como esto?

La clase parcial solo es posible en el mismo espacio de nombres y en el mismo ensamblaje.

El espacio de nombre podría estar en dos ensamblajes diferentes, pero la clase parcial no podría.

Aquí hay algunos puntos a considerar al implementar las clases parciales:

  • Use palabra clave parcial en cada parte de la clase parcial.

  • El nombre de cada parte de la clase parcial debe ser el mismo, pero el nombre del archivo fuente para cada parte de la clase parcial puede ser diferente.

  • Todas las partes de una clase parcial deben estar en el mismo espacio de nombres.

  • Cada parte de una clase parcial debe estar en el mismo ensamblado o DLL, en otras palabras, no puede crear una clase parcial en los archivos fuente de un proyecto de biblioteca de clase diferente.

  • Cada parte de una clase parcial tiene la misma accesibilidad. (como privado, público o protegido)

  • Si hereda una clase o interfaz en una clase parcial, entonces se hereda en todas las partes de una clase parcial.

  • Si se sella una parte de una clase parcial, entonces se sellará toda la clase.

  • Si una parte de la clase parcial es abstracta, entonces toda la clase se considerará una clase abstracta.

Esto no funcionará. El comstackdor le dará un error de nombre ambiguo en la Foo classFoo = new Foo(); línea. Para que las clases parciales funcionen, deben estar en el mismo espacio de nombres porque el espacio de nombres es realmente parte del nombre completo del tipo.

Además, para las clases estáticas puede implementar algo como esto con la ayuda de C # 6.0 reciente usando la característica estática .

Considerar:

 namespace SomeLogic1 { public static class Util { public static int Bar1() { return 1; } } } namespace SomeLogic2 { public static class Util { public static int Bar2() { return 2; } } } namespace GeneralStuff { using SomeLogic1; using SomeLogic2; public class MainClass { public MainClass() { // Error CS0104 // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util' var result = Util.Bar1() + Util.Bar2(); } } } 

Correcto, eso no comstack, el mensaje de error es claro. Para solucionar la situación, puede especificar directamente los espacios de nombres (pero no quiere esto por lo que yo entiendo):

 namespace GeneralStuff { public class MainClass { public MainClass() { var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); } } } 

O puede aplicar utilizando la función estática de esta manera:

 namespace GeneralStuff { using static SomeLogic1.Util; using static SomeLogic2.Util; public class MainClass { public MainClass() { var result = Bar1() + Bar2(); } } } 

Quizás esté bien hacer esto para algunas clases de ayuda / utilidades. Pero las clases parciales no son el camino, como otros han notado.

Restricciones sobre clases parciales y el método de MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx