作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个像这样的 .NET 类:
public class Person {
public string Name { get; set; }
public int Id { get; set; }
}
IPerson
接口(interface),并有
Person
实现它。有没有办法从 Visual Studio 外部以编程方式做到这一点?如果不能以编程方式完成,我什至会使用 shell 脚本。
xsd.exe
已经生成了这些类。 .因此,如果我理解正确,我需要采取的步骤是:
xsd.exe
生成类. 最佳答案
后来我遇到了同样的问题,找到了上面接受的解决方案,并决定在此处添加更多信息和详细信息,以了解我如何使用反射和其他功能以编程方式在源代码中生成接口(interface)。 (如果您不关心使用自定义属性标记源代码以生成代码,请跳过这第一 block 代码)
为了灵 active ,我创建了名为 GenerateInterface 和 GenerateInterfaceMember 的自定义属性(只是我自己的创作)来标记我想要明确导出到接口(interface)的部分的类和成员(或者您可以默认导出所有公共(public)成员,无论您喜欢什么)。例如,我将这样的属性应用于 Store 类......
[GenerateInterface(InterfaceName="IStore", NamespaceName="Com.Example.GenerationTest")]
class Store : BusinessObject {
string _name;
[GenerateInterfaceMember]
public event EventHandler handler;
internal Store(IDomain domain, string name)
: base(domain) {
_name = name;
}
[GenerateInterfaceMember]
public string GetSomething(int a, int b, Random r, Store s) {
throw new NotImplementedException();
}
//etc...
using Microsoft.CSharp; // for C#
using Microsoft.VisualBasic; // for VB.NET
CodeDomProvider provider = null;
// snip...
case "CSharp":
provider = CodeDomProvider.CreateProvider("CSharp");
break;
case "Visual Basic":
provider = CodeDomProvider.CreateProvider("VisualBasic");
break;
Microsoft.CSharp.CSharpCodeProvider csProvider = new CSharpCodeProvider();
Microsoft.VisualBasic.VBCodeProvider vbProvider = new VBCodeProvider();
// me setting up string capture for my purposes
StringBuilder szBuilder = new StringBuilder();
StringWriter writer = new StringWriter(szBuilder);
// the key statement - writes c# code to StringBuilder using provider instance and compile unit instance
csProvider.GenerateCodeFromCompileUnit(compileUnit, writer, new CodeGeneratorOptions());
// solidifying the generated C# code into one string
string sourceCode = szBuilder.ToString();
// can write this string to a file, etc....
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.4200
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Com.Example.GenerationTest {
using System;
using Com.Example.BusinessCore;
public interface IStore {
string Name {
get;
set;
}
event System.EventHandler handler;
string GetSomething(int a, int b, System.Random r, Store s);
}
}
关于.net - 有没有办法以编程方式提取接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484489/
我是一名优秀的程序员,十分优秀!