C#-CodeDomSerializer输出顺序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-CodeDomSerializer输出顺序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5810字,纯文字阅读大概需要9分钟。
内容图文
![C#-CodeDomSerializer输出顺序](/upload/InfoBanner/zyjiaocheng/656/f62165479e6c424ea9fe85ca5c7a8d67.jpg)
我创建了一个组件来为我们的项目做一些本地化工作.我遇到的问题是,输出到InitializeComponent的代码输出太晚了.
例
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ucHome));
this.localizationResourceManager1 = new Compass0.Localization.LocalizationResourceManager(this.components);
//Other designer code to create controls (this is all in the first block of code in InitializeComponent
Compass0.Localization.XMLResourceManager.Create(typeof(ucViewHome), ref resources); //created by my code serializier
//
// btnLogin
//
等
但是设计师所发生的是
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ucHome));
this.btnLogin = new ComponentFactory.Krypton.Toolkit.KryptonButton();
this.localizationResourceManager1 = new Compass0.Localization.LocalizationResourceManager(this.components);
//Other designer code to create controls (this is all in the first block of code in InitializeComponent
//
// btnLogin
//
this. btnLogin.Name = "btnLogin";
this. btnLogin.Text = resources.GetString("btnLogin.Text");
Compass0.Localization.XMLResourceManager.Create(typeof(ucViewHome), ref resources); //created by my code serializier
在资源初始化之后,我基本上需要强迫设计人员将代码放在第三行.有没有办法可以直接做到这一点?我的代码生成类如下.
public override object Deserialize( IDesignerSerializationManager manager, object codeDomObject )
{
CodeDomSerializer baseSerializer = ( CodeDomSerializer )manager.GetSerializer( typeof( LocalizationResourceManager ).BaseType, typeof( CodeDomSerializer ) );
return baseSerializer.Deserialize( manager, codeDomObject );
}
public override object Serialize( IDesignerSerializationManager manager, object value )
{
CodeDomSerializer baseSerializer = ( CodeDomSerializer )manager.GetSerializer( typeof( LocalizationResourceManager ).
BaseType, typeof( CodeDomSerializer ) );
object codeObject = baseSerializer.Serialize( manager, value );
if ( codeObject is CodeStatementCollection )
{
CodeStatementCollection statements = ( CodeStatementCollection )codeObject;
CodeTypeDeclaration classTypeDeclaration = ( CodeTypeDeclaration )manager.GetService(typeof( CodeTypeDeclaration ) );
CodeExpression typeofExpression = new CodeTypeOfExpression( classTypeDeclaration.Name );
CodeDirectionExpression resourceRef = new CodeDirectionExpression( FieldDirection.Ref, new CodeVariableReferenceExpression( "resources" ) );
CodeExpression ResourceManagerAssignment = new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression( typeof(XMLResourceManager).ToString() ),
"Create", new CodeExpression[] { typeofExpression, resourceRef } );
statements.Insert( 0, new CodeExpressionStatement( ResourceManagerAssignment ) );
}
return codeObject;
}
解决方法:
我知道这真的很晚,但是对于任何偶然发现这个问题的人来说…
我在做完全相同的事情,要解决此问题,我只是通过创建一个从ComponentDesigner继承的类并使用Initialize方法来确保首先创建/序列化了本地化控件,该方法获取控件列表,删除自身并重新添加自身在列表的顶部.然后,将Designer属性添加到我的自定义组件中.
它在VB中,如果有人需要将其翻译为C#,请告诉我…
<Designer(GetType(LocalizerDesigner))>
<DesignerSerializer(GetType(LocalizerSerializer), GetType(CodeDomSerializer))>
Public Class Localizer
Inherits Component
Public Sub GetResourceManager(type As Type, ByRef manager As ComponentResourceManager)
' Replace resource manager w/ new one.
End Sub
End Class
Public Class LocalizerSerializer
Inherits CodeDomSerializer
Public Overrides Function Deserialize(manager As IDesignerSerializationManager, codeObject As Object) As Object
Dim baseSerializer As CodeDomSerializer = DirectCast(manager.GetSerializer(GetType(Component), GetType(CodeDomSerializer)), CodeDomSerializer)
Return baseSerializer.Deserialize(manager, codeObject)
End Function
Public Overrides Function Serialize(manager As IDesignerSerializationManager, value As Object) As Object
Dim baseSerializer As CodeDomSerializer = DirectCast(manager.GetSerializer(GetType(Component), GetType(CodeDomSerializer)), CodeDomSerializer)
Dim codeObject As Object = baseSerializer.Serialize(manager, value)
Dim statementCollection As CodeStatementCollection = TryCast(codeObject, CodeStatementCollection)
If statementCollection IsNot Nothing Then
Dim formClassTypeDeclaration As CodeTypeDeclaration = DirectCast(manager.GetService(GetType(CodeTypeDeclaration)), CodeTypeDeclaration)
Dim typeofFormExpression As New CodeTypeOfExpression(formClassTypeDeclaration.Name)
Dim outResourcesExpression As New CodeDirectionExpression(FieldDirection.Out, New CodeVariableReferenceExpression("resources"))
Dim getResourceManagerExpression As New CodeMethodInvokeExpression(MyBase.SerializeToExpression(manager, value), "GetResourceManager",
{typeofFormExpression, outResourcesExpression})
statementCollection.Add(New CodeExpressionStatement(getResourceManagerExpression))
End If
Return codeObject
End Function
End Class
Public Class LocalizerDesigner
Inherits ComponentDesigner
Public Overrides Sub Initialize(component As IComponent)
MyBase.Initialize(component)
Dim designerHost As IDesignerHost = TryCast(GetService(GetType(IDesignerHost)), IDesignerHost)
If designerHost Is Nothing Then
Return
End If
Dim innerListProperty As Reflection.PropertyInfo = designerHost.Container.Components.GetType().GetProperty("InnerList", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.FlattenHierarchy)
Dim innerList As ArrayList = TryCast(innerListProperty.GetValue(designerHost.Container.Components, Nothing), ArrayList)
If innerList Is Nothing OrElse innerList.IndexOf(component) <= 1 Then
Return
End If
innerList.Remove(component)
innerList.Insert(0, component)
End Sub
End Class
内容总结
以上是互联网集市为您收集整理的C#-CodeDomSerializer输出顺序全部内容,希望文章能够帮你解决C#-CodeDomSerializer输出顺序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。