我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.
谢谢!
在C#中是否可以扩展一个类,而不仅仅是添加函数而是属性.例如:我有一个我依赖的标准DLL库,供应商不想修改它.
在整个代码中我已经广泛使用了DataCell类,现在才意识到我需要为它添加一个额外的属性,因为创建一个继承自这个类的新扩展类看起来不会起作用+大量的重写.
DataCell [元数据]
public class DataCell : Message
{
public int Field1;
public int Field2;
public DataCell()
{
..
}
..
}
Run Code Online (Sandbox Code Playgroud)
基本上我想添加一个public int Flags; 到这堂课.所以我现在可以做而不重写任何东西,(新的DataCell).Flags = 0x10;
假设我有一个名为的类Foo.
我无法更改Foo类,但我不想使用名为Bartype 的属性来扩展它string.
此外,我还有更多类,Foo所以我对"通用"解决方案感兴趣.
我正在调查ExpandoObject,dynamic它给了我我要求的结果,但我想知道它可以在不使用的情况下完成dynamic......
static void Main(string[] args)
{
var foo = new Foo() { Thing = "this" };
var fooplus = Merge(foo, new { Bar = " and that" });
Console.Write(string.Concat(fooplus.Thing, fooplus.Bar));
Console.ReadKey();
}
public class Foo
{
public string Thing { get; set; }
}
public static dynamic Merge(object item1, object item2)
{
if (item1 == null || item2 == null) …Run Code Online (Sandbox Code Playgroud) 在视图中的表中显示Customer的邮件地址时,请考虑以下代码:
<%: Customer.MailingAddress == null ? "" : Customer.MailingAddress.City %>
Run Code Online (Sandbox Code Playgroud)
我发现自己使用了相当数量的这些三元条件语句,我想知道是否有一种方法可以在条件中引用回被评估的对象,以便我可以在表达式中使用它.也许是这样的事情:
<%: Customer.MailingAddress == null ? "" : {0}.City %>
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?我知道我可以创建一个变量来保存值,但是将所有内容保存在视图页面中的一个紧凑的小语句中会很好.
谢谢!
我有一个关于C#的奇怪问题.
我有一个静态类来存储方法作为扩展.然后,我有以下扩展名:
public static bool fwHasData(this DataTable table)
{
return (table == null || table.Rows.Count == 0) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:当我尝试在我的代码中使用扩展时,存在一些避免使用括号的方法吗?
用法:
bool vHasData = MyDataTable.fwHasData(); // Works fine!
Run Code Online (Sandbox Code Playgroud)
预期用途:
bool vHasData = MyDataTable.fwHasData; // Removing the parentheses
Run Code Online (Sandbox Code Playgroud)
非常感谢!
当我为域设计模型时,它们几乎总是.IsSomething在它们上面有一些功能. IsNew并且IsDirty对于数据持久性目的而言是常见的,IsValid对于业务规则验证,甚至IsFraudulent在当前项目中(更多业务规则验证)等.每当我看到其他人实现这些时,它们几乎总是作为方法完成.但我发现自己想知道是否有特殊原因.
我倾向于将属性描述为描述对象和方法以执行某种操作.这些并不是真正的行动.它们涉及代码,因为它们在被调用时是动态确定的,并且它们显然是只读的,但对我来说它们仍然适合作为属性而不是方法.
我想,可能存在属性的序列化问题.虽然丰富的域模型往往不能很好地序列化,因为它包含逻辑和功能,所以每当我需要在服务边界上移动某些东西时,我通常首先将它扁平化为定义的DTO结构.
但我想知道其他人是否对这个问题有任何见解?是否有充分的理由将这些实现为方法而不是属性?
(切向相关,虽然已经给出了答案,但扩展属性确实有助于在这样的事情上保持一致.我有许多IsSomething()扩展方法,通常System.String用于实现特定于域的逻辑.但即使属性是通过go,我可能想坚持使用方法只是为了与扩展保持一致.)
是否可以将自定义属性添加到作为.NET框架一部分的对象?
我知道如果我只是给一个类我写了一个属性我会怎么做,但是如何在FileSystemWatcher类中添加一个自定义属性呢?
我在想要从XML文件中观看的路径中加载,但是也想添加一个属性来存储更多信息,在这种情况下是配置文件的位置.我可以将此属性添加到FileSystemWatcher类本身吗?
Lists的.Last()方法仅返回一个值.我希望能够做到这样的事情.
List<int> a = new List<int> { 1, 2, 3 };
a.Last() = 4;
Run Code Online (Sandbox Code Playgroud)
这是我尝试编写扩展方法(它不编译)
public unsafe static T* mylast<T>(this List<T> a)
{
return &a[a.Count - 1];
}
Run Code Online (Sandbox Code Playgroud)
我想做什么?
编辑:
这是我想要使用它的一个例子.
shapes.last.links.last.points.last = cursor; //what I want the code to look like
//how I had to write it.
shapes[shapes.Count - 1].links[shapes[shapes.Count - 1].links.Count - 1].points[shapes[shapes.Count - 1].links[shapes[shapes.Count - 1].links.Count - 1].points.Count-1] = cursor;
Run Code Online (Sandbox Code Playgroud)
这就是做的原因
shapes[shapes.Count-1]
Run Code Online (Sandbox Code Playgroud)
不是一个真正的解决方案.
我想扩展字符串对象并将这些扩展作为嵌套类的一部分,但是直接这样做:
public static class StringExtensions
{
public static class Patterns
{
public static string NumbersOnly(this string s)
{
return new String(s.Where(Char.IsDigit).ToArray());
}
}
}
Run Code Online (Sandbox Code Playgroud)
...给出了这篇文章标题所述的错误.
我怎么能以不同的方式写这个,这样当我调用它时,可以像这样调用它:
string s = "abcd1234";
s = s.Patterns.NumbersOnly();
Run Code Online (Sandbox Code Playgroud)
我知道我可以NumbersOnly作为直接的孩子移动StringExtensions以使错误消失,但我的意图是将方法组织成具有许多方法的类别.在这个例子中,NumbersOnly只是我打算在那里进行的大约40个模式匹配中的一个,我不希望用以下方法混淆对象的根; PatternNumbersOnly或者NumbersOnly等等.
注意:这个问题是不是这样的问题不同的这一个,因为我没有问为什么这个问题的存在,我要寻找一个解决办法,这样我可以有此错误的原因是否认我的功能或类似的功能.
我具有用于与在一个单独的扩展方法控制台应用程序的单个模块Extensions命名空间和类,在称为DataProcessor类using Extensions;,有效如下与外来代码移除:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataProcessor
{
using Extensions;
class Program
{
public static int Main(string[] Args)
{
for (int CtrA = 0; CtrA <= 100; CtrA++)
{
System.Diagnostics.Debug.Print((CtrA + 1).Ordinal); // Error occurs here
}
}
}
}
namespace Extensions
{
public static class Extensions
{
public static string Ordinal(int Number)
{
string Str = Number.ToString();
Number = Number % 100;
if ((Number >= 11) …Run Code Online (Sandbox Code Playgroud) c# ×11
.net ×1
arraylist ×1
asp.net-mvc ×1
c#-6.0 ×1
domain-model ×1
dynamic ×1
filesystems ×1
mixins ×1
oop ×1
reflection ×1