<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SergioTarrillo - RichWeblog : C#, Best Practices</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/Best+Practices/default.aspx</link><description>Etiquetas: C#, Best Practices</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Validation Application Block en el Enterprise Library 3.1</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/08/03/25245.aspx</link><pubDate>Fri, 03 Aug 2007 10:57:08 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:25245</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=25245</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/08/03/25245.aspx#comments</comments><description>&lt;p&gt;Estaba revisando la presentación, léase&amp;nbsp;ppt,&amp;nbsp;de las&amp;nbsp;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20-%20whats%20new.ppt" target="_blank"&gt;novedades en el Enterprise Library 3.x&lt;/a&gt;, y lo que más me llamo la atención, en esta corta&amp;nbsp;revisión, es el &lt;a target="_blank"&gt;Validation Application Block&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Puedes usar validaciones de tres formas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Usando atributos, si, puedes agregar los atributos a tus entidades de negocio, por ejemplo si tuvieras la entidad Usuario, y tuviera la propiedad Email, quedaría así:&lt;br /&gt;&lt;/li&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [RegexValidator(&lt;span style="color:#006080;"&gt;@&amp;quot;\w+([-+.&amp;#39;]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&amp;quot;&lt;/span&gt;, MessageTemplate=&lt;span style="color:#006080;"&gt;&amp;quot;Invalid e-mail address&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     Ruleset=&lt;span style="color:#006080;"&gt;&amp;quot;RuleSetA&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Email&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; email; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     set { email = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;li&gt;También lo podemos configurar, desde Enterprise Library Configuration.*&lt;/li&gt;
&lt;li&gt;O también hacerlo programáticamente.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;*Otra novedad interesante es que el &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480453.aspx" target="_blank"&gt;Enterprise Library 3.X&lt;/a&gt;, se integra en el IDE de Visual Studio 2005:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/08_Agosto/03_EntLib.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Y desde Visual Studio configurar todo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://galeon.com/solocodigo/images/blog/2007/08_Agosto/03_VS.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El Validation Application&amp;nbsp;Block, además se integra con WinForms, ASP.NET o WCF. Estas últimas&amp;nbsp;son cosas que tengo que probar aún, pero no quería dejar de enviar este post, con un pequeño overview que tuve de este Application Block, que por lo que se pinta promete mucho :). Aunque en este momento,&amp;nbsp;estoy en un dilema, de&amp;nbsp;si seguir revisando el VAB, o ir a dormir un par de horas por lo menos, antes de salir a la oficina :S (son las 05:58 a.m. :S), tengo miedo de&amp;nbsp;ya no despertar&amp;nbsp;:$, pero si voy a llegar tarde, que sea posteando :).&lt;/p&gt;
&lt;p&gt;Otros Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa480453.aspx" target="_blank"&gt;Enterprise Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb410105.aspx" target="_blank"&gt;Validation Application Block&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20-%20whats%20new.ppt" target="_blank"&gt;What&amp;#39;s New in Enterprise Library 3.x&lt;/a&gt;&amp;nbsp;(ppt)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.microsoft.com/download/b/2/2/b22eb038-fa47-4f5e-ac70-5e17d8db55aa/enterprise%20library%203.0%20overview.ppt" target="_blank"&gt;Enterprise Library 3.x: Overview&lt;/a&gt;&amp;nbsp;(ppt)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msevents.microsoft.com/cui/eventdetail.aspx?eventid=1032331979&amp;amp;culture=en-us" target="_blank"&gt;New Capabilities in Enterprise Library 3.x&lt;/a&gt;&amp;nbsp;(webcast)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt;Post cruzado&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=25245" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/developer_2B002B00_/default.aspx">developer++</category></item><item><title>Descarga gratuita de Materiales de Entrenamiento y Presentaciones de .NET, Arquitectura, BI, y otros via 3Dev</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/28/11132.aspx</link><pubDate>Thu, 01 Mar 2007 00:45:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:11132</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=11132</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/28/11132.aspx#comments</comments><description>&lt;p&gt;Hace tiempo que &lt;a href="http://blogs.3devnet.com/blogs/guino/default.aspx" target="_blank"&gt;Guino&lt;/a&gt; me comentó que iba actualizar la página de &lt;a href="http://www.3devnet.com/download.aspx" target="_blank"&gt;descargas de 3Dev&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Ahora &lt;a href="http://blogs.3devnet.com/blogs/guino/archive/2007/02/26/13967.aspx" target="_blank"&gt;que revivió&lt;/a&gt;, ha &lt;a href="http://blogs.3devnet.com/blogs/guino/archive/2007/02/28/14067.aspx" target="_blank"&gt;liberado los materiales&lt;/a&gt; de entrenamiento y presentaciones del año 2006, en la actual lista podrán encontrar:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Curso de Arquitectura .NET y Mejores Practicas - Workshop&lt;/li&gt; &lt;li&gt;Curso Patrones de Diseño con ejemplos en C# - Workshop&lt;/li&gt; &lt;li&gt;Curso de Business Intelligence con SQL Server 2005 - Workshop&lt;/li&gt; &lt;li&gt;Curso Visual Studio Team System - Nivel 200 - One Day Workshop&lt;/li&gt; &lt;li&gt;Desarrollando Aplicaciones Windows&amp;nbsp;con Visual Studio 2005 - Hands-On Labs&lt;/li&gt; &lt;li&gt;Desarrollando Aplicaciones Web&amp;nbsp;con ASP.NET 2.0 - Hands-On Labs&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La lista completa la encuentran en la sección de &lt;a href="http://www.3devnet.com/download.aspx" target="_blank"&gt;descargas de 3Dev&lt;/a&gt;. Veo que faltan algunas presentaciones, así que pronto se estara actualizando.&lt;/p&gt; &lt;p&gt;P.D.: Si tiene alguna pregunta, comentario o queja con los dos últimos HOLs que liste, me avisan ;).&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado &lt;a target="_blank" href="http://blogs.3devnet.com/blogs/default.aspx"&gt;3Dev Blogs&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=11132" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Patrones/default.aspx">Patrones</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Cursos/default.aspx">Cursos</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>databindig a una enumeracion (enum)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/07/8342.aspx</link><pubDate>Sun, 07 Jan 2007 06:24:52 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:8342</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=8342</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2007/01/07/8342.aspx#comments</comments><description>&lt;p&gt;Holas!&lt;/p&gt; &lt;p&gt;Ya en un &lt;a href="http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx" target="_blank"&gt;post&lt;/a&gt; del anio pasado xD, habíamos comentado como usar una estructura&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.enum(VS.80).aspx" target="_blank"&gt;enumeración&lt;/a&gt; en el modelo de n-capas, específicamente cuando tenemos que usar valores constantes como estados de noticia, aprobado, sinrevisar, novalida, y así.&lt;/p&gt; &lt;p&gt;Pues generalmente estos mismos valores, en sí los contenidos, ya que sólo&amp;nbsp;los valores van a la base de datos, pero los contenidos son los que usamos y los que mostraremos. Como decía estos valores los necesitaremos en un &lt;strong&gt;ComboBox&lt;/strong&gt; o un &lt;strong&gt;DropDownList&lt;/strong&gt;, y es obvio que llenarlos manualmente se&amp;nbsp;perdería productividad al hacer algún cambio futuro en los estados de una noticia por ejemplo. Lo óptimo es enlazarlo directamente a la enumeración de tal manera que no tengo que preocuparme al realizar un cambio.&lt;/p&gt; &lt;p&gt;Encontré, una encontré la otra la adapte, dos formas de hacerlo: una usando &lt;strong&gt;System.Reflection&lt;/strong&gt;, y la otra no.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.paulstovell.net/Posts/Post.aspx?postId=424d9f02-c1d8-4b2f-920c-389f602c27f8"&gt;&lt;strong&gt;Método 01&lt;/strong&gt;&lt;/a&gt;: Este me parece interesante porque te da la posibilidad de poner una descripción que después se puede usar para presentar al usuario:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; private List&amp;lt;EnumerationValue&amp;gt; ConvertEnumForBinding(System.Enum enumeration)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;EnumerationValue&amp;gt; results = new List&amp;lt;EnumerationValue&amp;gt;(); &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; // Use reflection to see what values the enum provides&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberInfo[] members = enumeration.GetType().GetMembers();&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; foreach (MemberInfo member in members)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // See if the member has a Description attribute:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] descriptionAttributes =&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;member.GetCustomAttributes(typeof(DescriptionAttribute), true); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (descriptionAttributes.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; string description = &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ((DescriptionAttribute)descriptionAttributes[0]).Description;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value = member.Name;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results.Add(new EnumerationValue(description, value));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;Imaginemos que la enumeración sea la siguiente: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; public enum EstadoNoticia&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("Sin Revisar")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SinRevisar = 1,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("Publicada")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Publicada = 2,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description("No Valida")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoValida = 3&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;Para enlazarlo a un dropdownlist sería de la siguiente forma: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataSource = ConvertEnumForBinding(new EstadoNoticia());&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataTextField = "DisplayText"&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataValueField = "Value"&lt;br&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataBind();&lt;/font&gt; &lt;p&gt;Por cierto, la definición de &lt;strong&gt;EnumerationValue&lt;/strong&gt; es la siguiente: &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp; public class EnumerationValue&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private string _displayText;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private object _value; &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public EnumerationValue()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public EnumerationValue(string displayText, object value)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _displayText = displayText;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _value = value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string DisplayText&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _displayText; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Value&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;Se me pueden ocurrir recuperar dos cosas, una el valor&amp;nbsp;entero o la enumeración misma: &lt;p&gt;En mi caso necesito la enumeración, que es la que pasaré a través de las capas: &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; EstadoNoticia val; &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; val = (EstadoNoticia)Enum.Parse(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(EstadoNoticia), ddlEstNoticia.SelectedValue, true);&lt;/font&gt; &lt;p&gt;Y el &lt;strong&gt;Método 02&lt;/strong&gt;:  &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; private List&amp;lt;EnumerationValue&amp;gt; ConvertEnumForBinding2(System.Enum enumeration)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;EnumerationValue&amp;gt; results = new List&amp;lt;EnumerationValue&amp;gt;(); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type todos = enumeration.GetType(); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string s in Enum.GetNames(todos))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value = Enum.Format(todos,Enum.Parse(todos, s), "d"); &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results.Add( new EnumerationValue(s,value));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;  &lt;p&gt;En este caso el &lt;strong&gt;DisplayText&lt;/strong&gt; será el valor de la enumeración por ejemplo "SinRevisar", y el &lt;strong&gt;Value&lt;/strong&gt; será el valor numérico. Algo que rescatar en este segundo método es la forma de &lt;a href="http://blogs.msdn.com/tims/archive/2004/04/02/106310.aspx" target="_blank"&gt;convertir un string a una enumeración&lt;/a&gt;. Además también se podría usar el método&amp;nbsp;&lt;strong&gt;IsDefined&lt;/strong&gt; para comprobar si el string existe como enumeración. Para ver todos los métodos de una enumeración &lt;a href="http://msdn2.microsoft.com/es-es/library/system.enum_members(VS.80).aspx" target="_blank"&gt;ver aquí&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.: En este ejemplo, por fines didácticos se muestra como si todo se hiciera en una sola capa, pero en un modelo en capas se encapsularía el método de traer los estados, por ejemplo:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp; ddlEstNoticia.DataSource = NOTAgente.ListarEstadosNoticia();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=8342" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>iniciando un valor enum a null? ( .NET)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx</link><pubDate>Fri, 22 Dec 2006 18:58:48 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7851</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=7851</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/22/7851.aspx#comments</comments><description>&lt;p&gt;Es de hecho que muchas veces usaremos &lt;strong&gt;enum&lt;/strong&gt;, para grupos de código, y es una buena práctica hacerlo. Y es que es útil a simple vista, cuando usamos un mensajes en Windows Forms, con la enumeración &lt;strong&gt;MessageBoxButtons&lt;/strong&gt;, elegimos cuantos botones deseamos que tenga la ventana de diálogo. Además que también sirve como filtro y ayuda a protegerse de un input indeseado del usuario. También hay la opción de que un valor de una&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/sbbt4032(VS.80).aspx" target="_blank"&gt;enumeración&lt;/a&gt; tenga opciones múltiples,&amp;nbsp;lo hace manejandolo como&amp;nbsp;bits,&amp;nbsp;para eso usamos el atributo &lt;a href="http://msdn2.microsoft.com/es-es/library/system.flagsattribute(VS.80).aspx" target="_blank"&gt;Flags&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ahora pero que pasa si quiere iniciar la variable &lt;strong&gt;enum&lt;/strong&gt; en&amp;nbsp;null, y es lo mismo que pasa cuando queremos iniciar una fecha en null. Sobre todo en el manejo de capas, para pasar variables entre capas muchas veces se debe colocar una fecha a la mala, aunque no uses la variable y aunque no es un problema no es lo ideal.&lt;/p&gt; &lt;p&gt;Y es así&amp;nbsp;que&amp;nbsp;surgen&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.nullable(VS.80).aspx" target="_blank"&gt;nullable types&lt;/a&gt;, en un post &lt;a href="http://blogs.3devnet.com/blogs/starrillo/archive/2006/06/01/191.aspx" target="_blank"&gt;anterior&lt;/a&gt;&amp;nbsp;ya hemos hablado de ellos. Ahora, como usamos los nullable types en el manejo de capas, pues&amp;nbsp;lo pueden encontrar usando el &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/12/ServiceStation/Default.aspx?loc=es" target="_blank"&gt;Web Service Software Factory&lt;/a&gt;. En &lt;a href="http://www.gotdotnet.com/" target="_blank"&gt;gotdotnet&lt;/a&gt; podemos encontrar unos HOLs de como usar el &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=6fde9247-53a8-4879-853d-500cd2d97a83" target="_blank"&gt;Service Factory&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ah por cierto si comparamos un tipo&amp;nbsp;valor con null, siempre será falso, ya que un tipo valor nunca es null. Es por eso que se&amp;nbsp;hace necesario el usar &lt;strong&gt;nullable types&lt;/strong&gt;. También se puede usar &lt;a href="http://msdn2.microsoft.com/es-es/library/ah19swz4(VS.80).aspx" target="_blank"&gt;struct&lt;/a&gt; con nullable, pero hay unos artificios que tienes que hacer.&lt;/p&gt; &lt;p&gt;Ahora veamos como lo usaría la enumeración &lt;strong&gt;Mes&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#008000"&gt;&amp;nbsp;&amp;nbsp; Nullable&amp;lt;Mes&amp;gt; m2 = null;&lt;br&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine("m2 {0}", (m2.HasValue) ? "no es nulo" : "es nulo");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; m2 = Mes.Febrero; &lt;br&gt;&amp;nbsp;&amp;nbsp; if (m2 != null)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("el valor de m2 es: {0}", (int)m2);&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Obviamente que una enumeración Mes, parece del curso de estructura de datos, pero ya en un ambiente real, podríamos usar una enumeración para un post o noticia, es decir noPublicada, Publicada, Spam, etc. De esa manera en todo mi sistema de capas&amp;nbsp;no tengo porque recordar que código era el estado de noticia publicada, para eso uso una enumeración. Pero al final en la base de datos lo que quiero es el código es decir el (int).&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;
&lt;br /&gt; Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7851" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>typeof vs if... y el limpiado (clear) de controles</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/14/7518.aspx</link><pubDate>Thu, 14 Dec 2006 19:01:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7518</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=7518</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/12/14/7518.aspx#comments</comments><description>&lt;P&gt;leyendo el post de &lt;A href="http://geeks.ms/blogs/jberrocal/default.aspx" target=_blank&gt;JuanFco&lt;/A&gt;, &lt;A href="http://geeks.ms/blogs/jberrocal/archive/2006/12/14/limpiar-informacion-de-los-controles-textbox-s-rapidamente.aspx" target=_blank&gt;Limpiar informacion de los controles (TextBox's) Rapidamente&lt;/A&gt;, y debido a que&amp;nbsp;mi comentario se puso muy técnico, aproveche para hacer un post.&lt;/P&gt;
&lt;P&gt;Cuanto tenía que hacer este tipo de cosas, limpiar masivamente&amp;nbsp;usaba el mismo código pero con la comparación distinta, que me paso un amigo en un proyecto: &lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#008000&gt;if ( c.GetType() == typeof(TextBox) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.Text = "";&lt;BR&gt;}&lt;/FONT&gt; 
&lt;P&gt;Según la definición de "&lt;STRONG&gt;is&lt;/STRONG&gt;" &amp;lt;&lt;A href="http://msdn2.microsoft.com/es-es/library/scekt9xw(VS.80).aspx"&gt;http://msdn2.microsoft.com/es-es/library/scekt9xw(VS.80).aspx&lt;/A&gt;&amp;gt; realiza una conversión para comprobar si "c" es del tipo TextBox (según lo que interprete, salvo que el "y" sea conclusión y no conjunción :S). Parece que tiene más utilidad cuando vas a realizar conversiones y quieres comprobar si ese tipo es el que tu quieres. 
&lt;P&gt;Estuve probando los tiempos de diferencia y sólo en casos muy extremos hay ligera diferencia donde "&lt;STRONG&gt;is&lt;/STRONG&gt;" toma unas milesimas de segundo más que "&lt;STRONG&gt;typeof&lt;/STRONG&gt;". 
&lt;P&gt;Y cómo todos ustedes se deben estar preguntando entonces, que uso &lt;STRONG&gt;typeof&lt;/STRONG&gt; o &lt;STRONG&gt;is&lt;/STRONG&gt;?, pués ya iba a terminar de enviar el comentario, y lanzar una idea de sentido común, y era que &lt;STRONG&gt;is&lt;/STRONG&gt; podría reconocer herencia de clases. Y nada le puse manos a la obra, y mi sentido común tenia razón, &lt;STRONG&gt;is&lt;/STRONG&gt; reconoce herencia: 
&lt;P&gt;Falso, de toda falsedad: &lt;FONT face="Courier New" color=#008000&gt;( textBox1.GetType() == typeof(Control) )&lt;/FONT&gt; 
&lt;P&gt;Comprobado, &lt;STRONG&gt;is&lt;/STRONG&gt; reconoce herencia: &lt;FONT face="Courier New" color=#008000&gt;( textBox1 is Control )&lt;/FONT&gt; 
&lt;P&gt;Saludos,&lt;/P&gt;&lt;BR&gt;Post cruzado&lt;img src="http://geeks.ms/aggbug.aspx?PostID=7518" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item><item><title>Conversion implicita y explicita entre tipos personalizados (Custom Types)</title><link>http://geeks.ms/blogs/sergiotarrillo/archive/2006/07/30/Conversion-implicita-y-explicita-entre-tipos-personalizados-_2800_Custom-Types_2900_.aspx</link><pubDate>Mon, 31 Jul 2006 03:54:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:1044</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=1044</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2006/07/30/Conversion-implicita-y-explicita-entre-tipos-personalizados-_2800_Custom-Types_2900_.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;Solo para recodar, solo para recordar &lt;IMG src="http://foros.solocodigo.com/html/emoticons/unsure.gif"&gt;, conversión implícita:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; a = 35;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;double&lt;/FONT&gt;&lt;FONT size=2&gt; b = a;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Y conversión explícita:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Verdana&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; num = &lt;FONT color=#800000&gt;"56"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; numero;&lt;BR&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;.TryParse(num, &lt;FONT color=#0000ff&gt;out&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; numero);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#008000&gt;//TryParse retorna falso si no se puede convertir la cadena&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008080&gt;Console&lt;/FONT&gt;.WriteLine(numero); &lt;FONT color=#008000&gt;//56&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ahora que pasa si quiero que mi clase&amp;nbsp;tipoB, se pueda convertir explícitamente o implícitamente a mi clase tipoA. Pues nosotros podemos implementar nuestras propias conversiones, tenemos la clase&amp;nbsp;tipoB:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;tipoB&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; name;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;public&lt;/FONT&gt; tipoB(&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; pname)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = pname;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;BR&gt;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; ToString()&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#800000&gt;"tipoB-"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; + name;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Ahora nuestro clase tipoA:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080 size=2&gt;tipoA&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; name;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;BR&gt;&amp;nbsp; public&lt;/FONT&gt; tipoA (&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; pname)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = pname;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;override&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; ToString()&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; &lt;FONT color=#800000&gt;"tipoA-"&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; + name;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; ////habilitando conversion implicita desde tipoB a tipoA&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; //public static implicit operator tipoA(tipoB arg)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; //{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; // tipoA tip = new tipoA(arg.name);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; // return tip;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;nbsp; //}&lt;BR&gt;&lt;BR&gt;&amp;nbsp; /&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#008000&gt;/convertir explicitamente desde tipoB a tipoA&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;explicit&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;operator&lt;/FONT&gt; &lt;FONT color=#008080&gt;tipoA&lt;/FONT&gt;(&lt;FONT color=#008080&gt;tipoB&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; arg)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&lt;FONT color=#008080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipoA&lt;/FONT&gt; tip = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;tipoA&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;(arg.name);&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt; tip;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Como podemos ver usando las palabras reservadas &lt;STRONG&gt;implicit operator&lt;/STRONG&gt; o &lt;STRONG&gt;explicit operator&lt;/STRONG&gt; podemos definir conversiones explícitas/implícitas para nuestros tipos personalizados, veamos la aplicación:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; Main(&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;[] args)&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;&amp;nbsp; tipoB&lt;/FONT&gt; tipB = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;tipoB&lt;/FONT&gt;(&lt;FONT color=#800000&gt;"hola"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;&amp;nbsp; Console&lt;/FONT&gt;.WriteLine(&lt;FONT color=#800000&gt;"objeto inicial: "&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; + tipB.ToString());&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;&amp;nbsp; //conversion implicita a tipoA&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp; //tipoA tipA = tipB;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;&lt;BR&gt;&amp;nbsp; //Conversion explicita a tipoA&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;&amp;nbsp; tipoA&lt;/FONT&gt; tipA = (&lt;FONT color=#008080&gt;tipoA&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;)tipB;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;&lt;BR&gt;&amp;nbsp; Console&lt;/FONT&gt;.WriteLine(&lt;FONT color=#800000&gt;"despues de conversion: "&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; + tipA.ToString());&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New" color=#008080&gt;&amp;nbsp; Console&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.ReadLine();&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Hay que tener en cuenta solo se puede declarar un tipo de conversión, es decir declaramos la conversión como &lt;STRONG&gt;implicit&lt;/STRONG&gt; o como &lt;STRONG&gt;explicit&lt;/STRONG&gt; pero no podemos declarar las dos para convertir el tipoX al tipoY. Por eso hemos comentado la conversión &lt;STRONG&gt;implicit&lt;/STRONG&gt; mostrada arriba, de lo contrario mostrará un error en tiempo de compilación. Ojo, eso solo en la declaración, ya que si declaramos una conversión implícita la podemos usar de forma implícita o explicíta, si la declaramos como explícita solo la podremos usar como explícita.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;P.D.&lt;/STRONG&gt;: Se pudo mejorar la construcción de la clase usando propiedades, y otras&amp;nbsp;mejores prácticas, pero no es el objetivo de este post, el objetivo es mostrar la conversión de tipos personalizados &lt;IMG src="http://foros.solocodigo.com/html/emoticons/biggrin.gif"&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Tarea&lt;/STRONG&gt;: Investigar sobre&amp;nbsp;&lt;A target="_blank" href="http://msdn2.microsoft.com/es-es/library/x4764854.aspx"&gt;TryParse&lt;/A&gt; &lt;IMG src="http://forums.asp.net/emoticons/emotion-15.gif"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Saludos,&lt;/FONT&gt;&lt;/P&gt;
&lt;br /&gt; Post cruzado desde &lt;a href="http://blogs.3devnet.com/blogs/starrillo/default.aspx"&gt;starrillo blog&lt;/a&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=1044" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Best+Practices/default.aspx">Best Practices</category></item></channel></rss>