挺直的.MSDN声明您可以使用ref,但不能使用部分方法.我只是好奇为什么?我的理解是,当编译代码时,部分被合并,那么限制是什么呢?还有更多partial
不仅仅是使代码文件更清洁和有组织(即eyecandy)?
我已经阅读了最新C#语言规范中的部分方法,所以我理解了原理,但我想知道人们是如何使用它们的.是否有特定的设计模式可以从部分方法中受益?
我正在阅读"Apress Pro LINQ:C#语言集成查询"这本书,我遇到了部分方法,但我真的不明白它们的需要是什么.
我认为本书中的示例(更改前后的属性)可以使用事件来实现.那有什么解释吗?
部分方法只能具有void返回类型这一事实背后的原因/逻辑/障碍是什么?
谢谢
我正在编写一个需要设置表单的 Winforms 项目。对于该设置表单,我想要两种模式:基本模式和高级模式。我已经编写了代码以使其在这两者之间进行更改,并且为了节省时间,我希望 InitializeComponent() 方法只需调用切换到基本模式时调用的相同方法。我创建了一个像这样的部分方法:
partial void InitializeComponent()
{
BasicSettingsButton_Click(new object(), new EventArgs());
}
Run Code Online (Sandbox Code Playgroud)
在我的程序文件中的部分类(不是 Windows 窗体设计器生成的类)中,并将 Window 窗体设计器生成的代码更改为:
partial void InitializeComponent();
//{
//...
//}
Run Code Online (Sandbox Code Playgroud)
我认为这是签名的正确语法,其实现定义如上所述。
但是,当我尝试构建代码时,它告诉我“没有找到用于实现部分方法 InitializeComponent() 声明的定义声明”,并指出我拥有的第一个代码示例。
我已经检查了名称,甚至复制并粘贴了相应的名称以确保它们相同,但我仍然无法让它运行。这是我的代码中阻止我构建和运行的唯一错误。有任何想法吗?
我正在阅读部分方法,因为它们将在C#-6/Visual Studio 2013更新2中与Windows Universal Projects结合使用变得更加重要.在阅读文档时,我读到了部分方法签名的奇怪限制:
部分方法可以有ref但不能输出参数.
我不明白这种限制的原因.由于部分方法基本上是在不同文件中签名和实现的常规方法,因此有哪些技术原因不支持参数?或者此限制的任何其他原因.特别是因为它们确实支持非常相似的 ref参数.
我知道标题可能不完全清楚,但我不想让它太久.
在考虑对部分方法的限制时,有一件事让我感到困惑.在我看来,规则是不一致的.你可能知道:
部分方法必须始终具有返回类型void,并且它们不能具有使用out修饰符标记的任何参数.这些限制已到位,因为在运行时,该方法可能不存在,因此您无法将变量初始化为方法可能返回的内容,因为该方法可能不存在.同样,您不能拥有out参数,因为该方法必须初始化它并且该方法可能不存在.[1]
这对我来说听起来很明智.但与此同时:
如果没有实现部分方法声明,则您不能拥有任何尝试创建引用partial方法的委托的代码.同样,原因是该方法在运行时不存在.[1]
起初,所有这些规则似乎遵循相同的编译器逻辑.但是有一点不同.如第二个引文中所述,编译器仅在没有部分方法的方法实现时才发出错误.为什么它不能在其他场景中检查编译时的实现?当使用部分方法时,这将允许更大的灵活性,并且所有规则背后的逻辑将是相同的.
我担心我能得到的唯一答案是"因为它是如何实施的",但也许还有更多的东西呢?
[1] CLR来自C#,第四版
internal List<CodeMemberMethod> createEventHooks()
{
string[] eventNames = new string[] { "OnUpdate", "OnInsert", "OnDelete", "OnSelect", "OnSelectAll" };
List<CodeMemberMethod> eventHooks = new List<CodeMemberMethod>();
foreach (string eventName in eventNames)
{
CodeMemberMethod eventHook = new CodeMemberMethod();
eventHook.Name = eventName;
eventHook.Attributes = MemberAttributes.ScopeMask;
eventHook.ReturnType = new CodeTypeReference("partial void");
}
return eventHooks;
}
Run Code Online (Sandbox Code Playgroud)
正在生成以下代码:
partial void OnUpdate() {
}
partial void OnInsert() {
}
partial void OnDelete() {
}
partial void OnSelect() {
}
partial void OnSelectAll() {
}
Run Code Online (Sandbox Code Playgroud)
如何让CodeDom删除" {}
",这将解决我正在尝试编译的编译器错误?我想过只使用一个CodeSnippetStatement
(我宁愿不这样做,因为这首先打破了使用CodeDom的目的),但我找不到CodeTypeDeclaration
类中添加片段的地方. …
背景
我使用Linq to SQL,因此生成包含自动生成的类的DBML文件.生成过程的一部分为某些操作创建了部分方法,在我的例子中,我感兴趣的两个方法与表记录的插入和更新有关.根据DBML设计器中创建的每个表生成这些部分方法,例如:
partial void InsertMyTable(MyTable instance);
partial void UpdateMyTable(MyTable instance);
Run Code Online (Sandbox Code Playgroud)
现在,我的应用程序设计的一部分要求始终为每个表实现这两个部分方法.(它们主要用于向正在插入/更新的记录添加时间戳).
需求
我有一个单元测试项目,虽然这可能不常见,但我希望包含一些测试,以确保某些事情已经正确实施.在这种情况下,我想确保开发人员记住实现上面提到的部分方法(我不关心实际的实现,只是他们已经实现).
问题
我需要做的是使用反射来检查是否已经实现了每个部分方法,但是我无法确定如何确定它.
尝试过的努力
到目前为止,我已经设法获得数据上下文中包含的方法列表,并且我能够将其与每个表的预期方法进行比较.问题是我无法找到确定给定的部分方法是否实际具有实现的方法:
var methods = (typeof(MyDataContext)).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var method in methods)
{
Console.WriteLine(method.Name);
//how to check if method is implemented, or just an unimplemented partial
}
Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,但这里有.
我有以下问题:
public class MyBaseClass
{
public void SomethingAwesome()
{
//Awesome stuff happens here, but only when the Something() method
//is called in the other classes.
}
}
public class SomeClass : MyBaseClass
{
public void Something()
{
//Something happens here
}
}
public class SomeOtherClass : MyBaseClass
{
public void Something()
{
//Something else happens here
}
}
Run Code Online (Sandbox Code Playgroud)
MyBaseClass有一个方法,当从继承它的类中调用Something()方法时需要调用该方法.
这背后的想法是,我需要记录这个方法被调用时出于很多无聊的公司原因.我宁愿有一个基类,它可以在调用方法时自动进行审计,而不是让开发人员自己调用该方法.
可以实现这样的事情吗?如果是这样,怎么样?
我已经考虑过部分方法,但这需要具有相同名称的类,这在这种情况下是不可能的.
c# ×11
partial-methods ×11
.net ×2
.net-3.5 ×1
class ×1
clr ×1
codedom ×1
methods ×1
reflection ×1
winforms ×1