2013-03-05 143 views
3

在C#中,当我括在括号中的int值,然后键入点,我获得可以对int值如何在c#中创建用户定义的函数,如(int).function()?

string a = (12).ToString(); 

我的问题是,我们如何定义自定义执行的功能的列表这样的功能?比如我要定义一个函数toDateTime能像这样工作

DateTime dt = ("12/12/12").toDateTime(); 

我完全理解,这可以通过正常的方式来完成也

DateTime dt = toDateTime("12/12/12"); 

我只是好奇它是怎么以另一种方式完成。

+0

也许通过[扩展方法](http://msdn.microsoft .COM/EN-US /库/ vstudio/bb383977.aspx)? – 2013-03-05 08:42:10

+1

注意:'()'没有什么特别的 - 你需要围绕'int'常量使用大括号来获得智能的原因是VS对待“12.”作为浮点数的开始,与所有其他类型不同(即字符串:“”aaa“。”显示对“字符串”的智能)。 – 2013-03-05 08:45:25

回答

6

你也许可以创造一个Extension Method

这样的:

public static class MyExtensions 
{ 
    public static DateTime ToDateTime(this String str) 
    { 
     // return something 
    } 
} 
+0

@Steve:对不起,我将参数类型修改为'string'而不是'DateTime' – 2013-03-05 08:43:56

+0

好,但为什么不添加在日期时间内转换该字符串的实际代码?这将完成答案 – Steve 2013-03-05 08:44:51

+0

@Steve我不认为这是必要的,因为它超出了实际问题的范围,imho – Nolonar 2013-03-05 08:45:53

6

你所描述的是extension methods

这些是IDE(Visual Studio)使它们看起来像是扩展类型的一部分的静态类和方法。

注意,没有必要附上括号类型:

string a = 12.ToString(); // not an extension method - it is defined on Object 
+0

+1。你需要大括号才能在整数文字的情况下拾取点:) – 2013-03-05 08:46:39

+2

@AlexeiLevenkov - Ctrl +空格通常就足够了。 – Oded 2013-03-05 08:47:14

+0

是的,但没有大括号没有神奇出现的列表。 – 2013-03-05 08:48:06

4

您不能:对原始类型这些功能,和功能,如ToString,这是在对象定义,是由框架提供。但是,您可以使用extension methods代替(或多或少)获得相同的结果。

扩展方法是静态类中的静态函数,IDE(VS)和编译器将其视为由第一个参数定义的类的成员函数(标记为this)。它们实际上与添加成员函数不同:它们的解析度和优先级是不同的。

+0

为清楚起见,ToString()是Object的成员,而不是扩展方法 – 2013-03-05 08:45:37

2

可以使用扩展方法

public static DateTime ToDateTime(this string datestring) 
{ 
    return DateTime.Parse(datestring); 
} 

扩展方法可以在static class

实施例内被打包:

static class Program 
{ 
    public static DateTime ToDateTime(this string datestring) 
    { 
     return DateTime.Parse(datestring); 
    } 
    static void Main(string[] args) 
    { 
     DateTime date = "12/12/12".ToDateTime(); 

    } 
} 
相关问题