- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
给定一个 Collection<T>
谁的类型T
仅在运行时(而不是在编译时)已知,我想生成一个 ImmutableList<T>
.
我想创建的方法可能像这样:
var immutableList = CreateImmutableList(originalList, type);
其中 originalList 是 IEnumerable
类型是 T
生成的 ImmutableList<T>
.
怎么办?!
(我正在使用 NET .Core)
编辑:感谢评论,我找到了一个可行的解决方案。它使用 AddRange 方法。
namespace Sample.Tests
{
using System;
using System.Collections;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using Xunit;
public class ImmutabilityTests
{
[Fact]
public void CollectionCanBeConvertedToImmutable()
{
var original = new Collection<object>() { 1, 2, 3, 4, };
var result = original.AsImmutable(typeof(int));
Assert.NotEmpty(result);
Assert.IsAssignableFrom<ImmutableList<int>>(result);
}
}
public static class ReflectionExtensions
{
public static IEnumerable AsImmutable(this IEnumerable collection, Type elementType)
{
var immutableType = typeof(ImmutableList<>).MakeGenericType(elementType);
var addRangeMethod = immutableType.GetMethod("AddRange");
var typedCollection = ToTyped(collection, elementType);
var emptyImmutableList = immutableType.GetField("Empty").GetValue(null);
emptyImmutableList = addRangeMethod.Invoke(emptyImmutableList, new[] { typedCollection });
return (IEnumerable)emptyImmutableList;
}
private static object ToTyped(IEnumerable original, Type type)
{
var method = typeof(Enumerable).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(type);
return method.Invoke(original, new object[] { original });
}
}
}
最佳答案
您可以使用反射来做到这一点:
Type
ImmutableList<T>
的对象这是一个LINQPad演示的程序。我假设“不可变列表”是指 System.Collections.Immutable.ImmutableList<T>
通过 Nuget 可用:
void Main()
{
object il = CreateImmutableList(new[] { 1, 2, 3, 4, 5 }, typeof(int));
il.GetType().Dump();
il.Dump();
}
public static object CreateImmutableList(IEnumerable collection, Type elementType)
{
// TODO: guard clauses for parameters == null
var resultType = typeof(ImmutableList<>).MakeGenericType(elementType);
var result = resultType.GetField("Empty").GetValue(null);
var add = resultType.GetMethod("Add");
foreach (var element in collection)
result = add.Invoke(result, new object[] { element });
return result;
}
输出:
System.Collections.Immutable.ImmutableList`1[System.Int32]
1
2
3
4
5
关于c# - 创建编译时未知类型的 ImmutableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37857463/
我有这个代码 final List connectedIds = getConnectedDevices(); final List allDbDevicesAsList = getA
我遇到了这个错误: Type mismatch: cannot convert from ImmutableList to ImmutableList 这是错误的代码:在线 COMPLETIONS =
我使用 com.google.common.collect.ImmutableList 不允许对列表中的元素进行任何修改。代码如下所示,但断言失败。MyObj 不会覆盖克隆方法,这就是它失败的原因吗?
我有以下代码。不确定发生了什么,但它在 1 小时前一直在工作,我没有做任何更改,现在它不工作了。 private final List people; private List friend; met
给定一个 Collection谁的类型T仅在运行时(而不是在编译时)已知,我想生成一个 ImmutableList . 我想创建的方法可能像这样: var immutableList = Create
所以我的程序中有这个奇怪的错误(据说没有更多错误之前的最后一个错误),无论我做什么都无法解决。我正在使用 jMonkey Engine 3 (jme3),这是一段有错误的代码: public List
代码是从其他项目下载的。在第 4 行,reverse() 函数出现错误。内容为“The method reverse() is undefined for the type ImmutableList
我有以下代码: private static final ImmutableMultimap namesToAddress; public static List getAddresses(Strin
我正在使用 Google 的 ImmutableList 类 http://google-collections.googlecode.com/svn/trunk/javadoc/com/google
出于好奇,我下载了 Google Guava 的源代码,想看看不可变集合的背后有什么支持。 我正在查看 ImmutableList,我注意到它仍然由老式数组支持,如 Object[] 所以我只是好奇,
是否在某处记录了 ImmutableList 的性能特征? ?我对渐近复杂性(big-O)感兴趣。 msdn 链接没有透露太多。 我知道 Add和 this[]都是 O(log n) from thi
我正在尝试为 Guava 的 ImmutableList 构建一个 Java 8 收集器实现。但是我不断收到奇怪的空指针错误。我的收集器出了什么问题? java.lang.NullPointerExc
我有一个 System.Collections.Immutable.ImmutableList我想检查其中是否存在某个项目并一步将其删除。像这样: var newList = oldList.Remo
当我深入研究 ImmutableList 的 gs-collection 源代码时,它没有扩展 java.util.List。然而类 javadoc 提到所有 ImmutableList 实现必须实现
我刚开始学习 Guava,我注意到 ImmutableList.builder() 有一些特别之处. 这不编译: List iList = ImmutableList.builder().add("O
我正在使用 Guava-05-snapshot 和 Sun 的 JDK 1.6执行此代码段的代码会爆炸: List badpasswords = Lists.newArrayList( Passwor
我可以创建一个 Guava ImmutableList 与 of方法,并将根据传递的对象获取正确的泛型类型: Foo foo = new Foo(); ImmutableList.of(foo); 但
我认为 ImmutableList 在添加和删除元素方面比 List 慢得多。是吗? 基准测试。 ImmutableList add 和 RemoveAt 的性能很好。 RemoveAt 甚至比 Li
我们鼓励我们尽可能地拥有不可变的变量。 但是有时候当我不得不修改列表时,我开始怀疑哪种方法更适合当前情况... val mutableList = mutableListOf() // where I
在 System.Collections.Generic 中有一个非常有用的 ImmutableList。但是对于这种类型,Autofixture 会抛出异常,因为它没有公共(public)构造函数,
我是一名优秀的程序员,十分优秀!