在.NET 4中创建在运行时确定的类型实例的最佳方法是什么?
我有一个实例方法,虽然作用于BaseClass对象可能会被其派生类的实例调用.我需要创建this与方法中相同类型的另一个实例.为每个派生类重载Method是不切实际的,因为它相当复杂,并且更有效地保持单个实现.
public class BaseClass
{
//constructors + properties + methods etc
public SomeMethod()
{
//some code
DerivedClass d = new DerivedClass(); //ideally determine the DerivedClass type at run-time
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些关于反射或使用动态关键字但我没有这些经验.
Tuple<int, double>[] obs1;
Tuple<int, double>[] obs2;
Run Code Online (Sandbox Code Playgroud)
我想做的是创造 Tuple<int, double>[] obs3
其中包含那些Tuple<int,double>具有相同int的两个obs1和obs2,然后设置相应的双为:
obs3[i].Item2 = obs1[i].Item2 + obs2[i].Item2
Run Code Online (Sandbox Code Playgroud)
我尝试用这种方式找到相关的元组:
var obs3 = from o in obs1 where obs2.Contains(o) select o;
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何访问和使用Item2 double,而我只是得到了一个子集obs1.
我一直对我的问题嗤之以鼻.我希望它能因为我没有尝试过第一次尝试解决方案.
不知道如何满足stackoverflow对这个的需求......
我想修改MathNET Numerics包,以便我可以使用索引器访问或分配子矩阵,如下所示:
A[rows, cols]
Run Code Online (Sandbox Code Playgroud)
其中,rows和cols是int[]
我编写了一个扩展方法Sub(int [] rows,int [] cols),它实现了相同的目标,但是使用索引方式会更聪明.
是否可以添加索引器的扩展而无需重建整个包?如果是这样的话?
我试图在consturctor中为一个派生类IntersectionPath转换一个对象列表,如下所示.
public class IntersectionPath : Path<IntersectionSegment>, IEnumerable
{
//Constructors
public IntersectionPath() : base() { Verts = null; }
public IntersectionPath(List<Intersection> inVerts, List<Segment<Node>> inEdges) : base()
{
this.Segments = (List<IntersectionSegment>) inEdges;
}
}
Run Code Online (Sandbox Code Playgroud)
段在通用基类Path中定义
public class Path<T> : IEnumerable<T> where T : Segment<Node>
{
//public properties
public List<Direction> Directions {get; set; }
public List<T> Segments { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我已经为IntersectionSegment类中的强制转换定义了一个显式运算符(见下文,因此不清楚为什么这不会编译.我在IntersectionPath构造函数中有一个错误消息.
public class IntersectionSegment : Segment<Intersection>
{
//curves which intersect the primary curve at I0(Start Node) and I1(End Node)
public Curve …Run Code Online (Sandbox Code Playgroud) 我有一个List,UserObj有一个DateTime数据成员和一个字符串Name成员.我想在列表中找到具有给定Name InputName和最接近输入DateTime InputDT的DateTime的UserObj
名称和日期时间可能都会出现,但会有一个独特的解决方案.
我想过:
UserObj user = userObjList.Where(u => ((u.Name ==inputName) && (userObjList.Min())).ToList()[0];
Run Code Online (Sandbox Code Playgroud)
但不确定如何指定最低条件?
我正在使用一个我没有问题的库(Astro.lib)(我想这是一个发布版本).
我还内置了一个项目,引用库(它会作为一个发布EXE罚款),但因为我得到的消息"无法启动程序'Astro.lib’我不能调试项目.
如果我尝试调试lib然后我得到相同的错误,所以我猜它与没有构建调试我的lib但不知道如何修改有关.
我尝试使用MSDN信息更改属性页但不确定我是否正在解决正确的问题.我应该对链接项目库的属性页进行哪些更改?
提前致谢
尝试在此派生类中设置通用基本集合类成员时,我遇到编译器错误.
error CS0029: Cannot implicitly convert type 'System.Collections.Generic.List<IntSegment>' to 'System.Collections.Generic.List<T>'
这是我的通用集合的大纲
public class Path<T> : IEnumerable<T> where T : Segment
{
private List<T> segments = new List<T>();
public List<T> Segments
{
set { segments = value; }
get { return this.segments; }
}
public Path()
{
this.Segments = new List<T>();
}
public Path(List<T> s)
{
this.Segments = s;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,为Segment的派生类IntSegment定义此集合的派生泛型类(为其定义基本集合)
public class IntersectionClosedPath<T> : Path<T>, IEnumerable<T> where T : IntSegment
{
public IntersectionClosedPath(List<IntSegment> inEdges)
: base()
{
Segments = …Run Code Online (Sandbox Code Playgroud) c# ×6
generics ×2
linq ×2
c++ ×1
casting ×1
debugging ×1
dynamic ×1
generic-list ×1
indexing ×1
min ×1
packages ×1
performance ×1
reflection ×1
runtime ×1
visual-c++ ×1