我正在创建一个带有一些可重用代码的C#库,并且正在尝试在方法中创建一个方法。我有这样的方法:
public static void Method1()
{
// Code
}
我想做的是:
public static void Method1()
{
public static void Method2()
{
}
public static void Method3()
{
}
}
然后我可以选择Method1.Method2
或Method1.Method3
。很显然,编译器对此并不满意,非常感谢任何帮助。感谢。
答案 0 :(得分:95)
如果使用嵌套方法,则表示只能在该方法中调用的方法(如在Delphi中),您可以使用委托。
public static void Method1()
{
var method2 = new Action(() => { /* action body */ } );
var method3 = new Action(() => { /* action body */ } );
//call them like normal methods
method2();
method3();
//if you want an argument
var actionWithArgument = new Action<int>(i => { Console.WriteLine(i); });
actionWithArgument(5);
//if you want to return something
var function = new Func<int, int>(i => { return i++; });
int test = function(6);
}
答案 1 :(得分:48)
这个答案是在C#7问世之前写的。使用C#7,可以编写本地方法。
不,你不能这样做。你可以创建一个嵌套类:
public class ContainingClass
{
public static class NestedClass
{
public static void Method2()
{
}
public static void Method3()
{
}
}
}
然后你打电话:
ContainingClass.NestedClass.Method2();
或
ContainingClass.NestedClass.Method3();
我不会推荐这个。 通常拥有公共嵌套类型是个坏主意。
您能告诉我们您正在努力实现的目标吗?可能有更好的方法。
答案 2 :(得分:42)
是的,当C# 7.0
被释放后,Local Functions将允许您这样做。您将能够在方法中使用方法:
public int GetName(int userId)
{
int GetFamilyName(int id)
{
return User.FamilyName;
}
string firstName = User.FirstName;
var fullName = firstName + GetFamilyName(userId);
return fullName;
}
答案 3 :(得分:25)
您可以使用完整代码在方法中定义委托,并根据需要调用它们。
public class MyMethods
{
public void Method1()
{
// defining your methods
Action method1 = new Action( () =>
{
Console.WriteLine("I am method 1");
Thread.Sleep(100);
var b = 3.14;
Console.WriteLine(b);
}
);
Action<int> method2 = new Action<int>( a =>
{
Console.WriteLine("I am method 2");
Console.WriteLine(a);
}
);
Func<int, bool> method3 = new Func<int, bool>( a =>
{
Console.WriteLine("I am a function");
return a > 10;
}
);
// calling your methods
method1.Invoke();
method2.Invoke(10);
method3.Invoke(5);
}
}
在类中使用嵌套类总是可以选择从外部看不到并调用其方法,例如:
public class SuperClass
{
internal static class HelperClass
{
internal static void Method2() {}
}
public void Method1 ()
{
HelperClass.Method2();
}
}
答案 4 :(得分:8)
从C#7.0开始,您可以这样做:
public static void SlimShady()
{
void Hi([CallerMemberName] string name = null)
{
Console.WriteLine($"Hi! My name is {name}");
}
Hi();
}
这称为本地功能,这正是您所寻找的。 p>
答案 5 :(得分:3)
为什么不使用课程?
public static class Helper
{
public static string MethodA()
{
return "A";
}
public static string MethodA()
{
return "A";
}
}
现在您可以通过
访问方法Helper.MethodA();
答案 6 :(得分:3)
旧线程,但C#确实具有嵌套函数的概念
Func<int> getCalcFunction(int total, bool useAddition)
{
int overallValue = 0;
if (useAddition)
{
Func<int> incrementer = new Func<int>(() =>
{
overallValue += total;
return overallValue;
});
return incrementer;
}
else
{
Func<int> decrementer = new Func<int>(() =>
{
overallValue -= total;
return overallValue;
});
return decrementer;
}
}
private void CalcTotals()
{
Func<int> decrem = getCalcFunction(30, false);
int a = decrem(); //result = -30
a = decrem(); //result = -60
Func<int> increm = getCalcFunction(30, true);
int b = increm(); //result = 30
b = increm(); //result = 60
}
答案 7 :(得分:2)
你几乎在那里
public static void Method1()
应该是
public static class Method1{}
答案 8 :(得分:1)
您不想使用嵌套类吗?
据说,你似乎不尊重Single Responsibility Principle,因为你想要一个方法一次做多件事。
答案 9 :(得分:-3)
为什么不在另一个
中运行方法public void M1() { 做东西 }
public void M1() { 做东西 M1(); }