在C#6中,您可以使用nameof()运算符来获取包含变量名称或类型的字符串.
这是在编译时评估,还是在运行时通过一些Roslyn API评估?
这就是我在许多其他类继承的类中作为方法提出的.这个想法是它允许在相同类型的对象的属性之间进行简单比较.
现在,这确实有效 - 但为了提高我的代码质量,我想我会把它扔出去仔细检查.它怎么能更好/更有效/等等?
/// <summary>
/// Compare property values (as strings)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool PropertiesEqual(object comparisonObject)
{
Type sourceType = this.GetType();
Type destinationType = comparisonObject.GetType();
if (sourceType == destinationType)
{
PropertyInfo[] sourceProperties = sourceType.GetProperties();
foreach (PropertyInfo pi in sourceProperties)
{
if ((sourceType.GetProperty(pi.Name).GetValue(this, null) == null && destinationType.GetProperty(pi.Name).GetValue(comparisonObject, null) == null))
{
// if both are null, don't try to compare (throws exception)
}
else if (!(sourceType.GetProperty(pi.Name).GetValue(this, null).ToString() == destinationType.GetProperty(pi.Name).GetValue(comparisonObject, null).ToString()))
{
// only …Run Code Online (Sandbox Code Playgroud) 我有一个对象,我想以这种方式构造:
var foo = new FancyObject(customer, c=>c.Email); //customer has Email property
Run Code Online (Sandbox Code Playgroud)
我该如何申报第二个参数?
访问所选属性setter/getter的代码如何?
UPD.模型中有多个实体具有Email属性.所以签名可能看起来像:
public FancyObject(Entity holder, Expression<Func<T>> selector)
Run Code Online (Sandbox Code Playgroud)
和构造函数调用
var foo = new FancyObject(customer, ()=>customer.Email);
Run Code Online (Sandbox Code Playgroud) 我需要按字段名称映射ObjectV1和ObjectV2之间的所有字段值和子集合.ObjectV2与ObjectV1位于不同的namspace中.
模板ClassV1和ClassV2之间的继承已被打折扣,因为这两个类需要独立发展.我已经考虑过使用反射(慢速)和二进制序列化(也很慢)来执行公共属性的映射.
有首选方法吗?还有其他选择吗?
我发现了类似的问题
这可能含蓄地和/或部分地回答了我的问题.
假设我想要比较(没有很多嵌套条件)这个对象:
class ObjectA {
public string PropertyX { get; set; }
public char PropertyY { get; set; }
public long PropertyZ { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到了System.String.我只对平等或不平等感兴趣(不是关于身份的一系列价值观).
实施IEquatable<string>中 ObjectA是一个正确的选择吗?我不关心什么只是简单的工作,我想确定这种情况的正确模式.
作为其他信息,请考虑ObjectA通常按顺序提供IEnumerable<ObjectA>.
我不需要知道是否"string" ==或!= objectA实例; 不涉及排序.
编辑以澄清(和帮助)
对不起,写一个好问题有时很难......
假设我不能将其表示ObjectA为字符串以进行比较(违反封装不是一种选择).
在上下文中,我要与之匹配PropertyY.
在context-2中,我要将它与应用于PropertyY/ 的算法相匹配PropertyZ.
@Oliver解决方案在问题的最后再次帮助我(再次+1).我可以简单地定义一个自定义界面:
interface IContextConverter {
string ToEquatableStringForContext1();
string ToEquatableStringForContext2();
}
Run Code Online (Sandbox Code Playgroud)
由于我也有一个 …
我想知道如何映射两个不同对象的字段并为其分配值.
Eample:
public class employee
{
public int ID { get; set; }
public string Name { get; set; }
}
public class manager
{
public int MgrId { get; set; }
public string MgrName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个List对象.我想将值分配给"manager"类.任何自动方式来做到这一点.我可以明确地做并为其分配值.但我的目标是非常巨大的问题.我也不想使用任何第三方工具.
注意:它不能为经理提供任何前缀.它可以是任何东西.(例如:mgrId可以像mgrCode)
这是一个学术问题比什么都重要......我知道有更多实用的手段可以开发......
假设您有以下代码:
public MyObject1 AssignTest(MyObject1 obj1,MyObject2 obj2){
Run Code Online (Sandbox Code Playgroud)public MyObject1 AssignTest (MyObject1 obj1, MyObject2 obj2) { //Code here for auto map }
MyObject1和MyObject2具有完全相同的可用属性.是否可以自动将MyObject1中指定的所有值分配给MyObject2?而不是通过声明性地分配值(即MyObject1.Property1 = MyObject2.Property1等)