c# - 是否可以有一个未知类型的数组?

标签 c# generics

public static bool Compare<T>(this T source, T other, params Expression<Func<T>>[] propertiesToSkip)
{
    PropertyInfo[] sourceProperties = source.GetType().GetProperties();
    List<string> lstPropertiesToSkip = (from x in propertiesToSkip select ((MemberExpression)((UnaryExpression)x.Body).Operand).Member.Name).ToList();
    return !(sourceProperties.Any(sourcePropertyInfo => !lstPropertiesToSkip.Contains(sourcePropertyInfo.Name) && (!sourcePropertyInfo.GetValue(source, null).Equals(sourcePropertyInfo.GetValue(other, null)))));
}

我希望能够调用这个函数。

var source = new MyClass();
var other = new MyClass();
source.Compare<MyClass>(other, ()=>SkipProperty1, ()=>SkipProperty2);

问题是 ()=>SkipProperty1 和 ()=>SkipProperty2 不是 MyClass 类型。 我需要:

Compare <A,B,C,D...>  
params Expression<Func<T>>[] where T is A,B,C,D,E...

我看过AutoMapper , 语法流畅。

public IMappingExpression<TSource, TDestination> ForMember(string name, Action<IMemberConfigurationExpression<TSource>> memberOptions);

Mapper.CreateMap<MyClass, MyClass>()
            .ForMember(dest => dest.Property1, opt => opt.Ignore())
            .ForMember(dest => dest.Property2, opt => opt.Ignore()));

- 我可以更改 Compare 的签名以使该功能正常工作吗?

- 还有其他方法可以解决这个问题吗?例如使用流利的语法

请注意,我不想将属性名称作为字符串发送。

最佳答案

一个选择是将您的 param 参数的签名更改为返回 object 的 lambda 表达式。像这样:

public static bool Compare<T>
  (this T source, T other, params Expression<Func<object>>[] propertiesToSkip)

这应该可以正常工作,因为任何 .NET 类型都可以转换或装箱到对象。您需要稍微调整代码以从 lambda 表达式中提取 PropertyInfo(因为会有额外的装箱或转换)。

使用流畅的语法也应该有效。你需要一些类型来传递:

class SkipComparison<T> {
  public T Source { get; set; }
  public T Other { get; set; }
  public List<PropertyInfo> PropertiesToSkip { get; set; }

  public SkipComparison<T> Skip<R>(Expression<Func<R>> f)
    // TODO: Extract property info, add it to 
    // 'PropertiesToSkip' and 'return this;'
  public bool Run()
    // TODO: Actually perform the comparison here
}

您的Compare 方法将返回此类的一个新实例,其中仅设置了SourceOther,您将使用 Skip 方法添加要跳过的其他属性。

关于c# - 是否可以有一个未知类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078143/

相关文章:

java - OnPostExecute 永远不会被调用

generics - 在 Ada 95 中创建通用子包

java - 如何使用单个类型参数为泛型类型指定两个具体类型参数?

scala - 泛型中的任何与下划线

c# - 如何在 WPF 中操作另一个类的窗口对象

c# - 如何与EventToCommandBehavior分离?

c# - C#Youtube api V3-值不能为空错误异常

c# - 在对话框 View 模型的异步加载中捕获异常

java - Java 中破坏逆变边界的安全解决方法?

generics - 如何直接使用泛型函数定义一个新的Fortran过程?