Tôi đã tìm kiếm trực tuyến tốt và không thể tìm thấy bất kỳ cách nào để thực hiện việc này. Nếu bất cứ ai biết một cách tích hợp sạch sẽ sau đó xin vui lòng cho tôi biết. Trong khi chờ đợi, tôi đã viết một nhiệm vụ đơn giản để thực hiện công việc. Việc sử dụng trông như thế này:
<NormalizeByMetadata Items="@(ItemsToNormalize)" MetadataName="Filename">
<Output TaskParameter="NormalizedItems" ItemName="MyNormalizedItems"/>
</NormalizeByMetadata>
Sau khi nhiệm vụ trên đã được thực hiện, MyNormalizedItems
sẽ chỉ chứa những mặt hàng từ ItemsToNormalize
có một giá trị duy nhất cho Filename
siêu dữ liệu. Nếu hai hoặc nhiều mục có cùng giá trị cho siêu dữ liệu Filename
của chúng, kết quả phù hợp đầu tiên sẽ được bao gồm trong đầu ra.
Mã cho nhiệm vụ MSBuild là:
public class NormalizeByMetadata : Task
{
[Required]
public ITaskItem[] Items
{
get;
set;
}
[Required]
public string MetadataName
{
get;
set;
}
[Output]
public ITaskItem[] NormalizedItems
{
get;
private set;
}
public override bool Execute()
{
NormalizedItems = Items.Distinct(new ItemEqualityComparer(MetadataName)).ToArray();
return true;
}
private sealed class ItemEqualityComparer : IEqualityComparer<ITaskItem>
{
private readonly string _metadataName;
public ItemEqualityComparer(string metadataName)
{
Debug.Assert(metadataName != null);
_metadataName = metadataName;
}
public bool Equals(ITaskItem x, ITaskItem y)
{
if (x == null || y == null)
{
return x == y;
}
var xMetadata = x.GetMetadata(_metadataName);
var yMetadata = y.GetMetadata(_metadataName);
return string.Equals(xMetadata, yMetadata);
}
public int GetHashCode(ITaskItem obj)
{
if (obj == null)
{
return 0;
}
var objMetadata = obj.GetMetadata(_metadataName);
return objMetadata.GetHashCode();
}
}
}
Nguồn
2008-12-14 16:10:44
Âm thanh hữu ích - cảm ơn. Sẽ thử lần sau tôi cần nó. –