我确定这是一项非常简单的任务,但我并不完全确定如何将其写入搜索查询。我得到的最好的是扩展方法,我无法理解它们或者语法正确。
我目前正在使用一个简化为GTA V制作mod的程序集。这些程序集包括一个Ped"类型"有一堆附加到它的方法。
我正在寻找的是能够添加我自己的方法,该方法可以将bool值存储为Ped类的扩展。
非常感谢任何帮助,谢谢。
答案 0 :(得分:4)
您可以使用ConditionalWeakTable
执行此任务:
ConditionalWeakTable<TKey, TValue>
对象是一个字典,它将一个由密钥表示的托管对象绑定到其附加属性,该属性由值表示。对象的键是附加属性的TKey类的各个实例,其值是分配给相应对象的属性值。
示例:
public static class PedExtensions
{
private static readonly ConditionalWeakTable<Ped, PedProperties> _props = new ConditionalWeakTable<Ped, PedProperties>();
public static bool GetMyBool(this Ped ped)
{
return _props.GetOrCreateValue(ped).MyBool;
}
public static void SetMyBool(this Ped ped, bool value)
{
_props.GetOrCreateValue(ped).MyBool = value;
}
private class PedProperties
{
public bool MyBool { get; set; }
}
}
(当然,如果您有许多要存储的属性,您可以将PedProperties
作为公共顶级类并直接公开它。
由于表使用弱引用,因此您不必担心内存泄漏:
ConditionalWeakTable<TKey, TValue>
类在管理集合中存储的键的对象生存期时与其他集合对象不同。通常,当一个对象存储在一个集合中时,它的生命周期一直持续到它被移除(并且没有对该对象的附加引用)或者直到集合对象本身被销毁为止。但是,在ConditionalWeakTable<TKey, TValue>
类中,向表中添加键/值对并不能确保键保持,即使可以直接从表中存储的值到达它(例如,如果表包含一个键A
,值为V1
,第二个键B
,其值为P2
,其中包含对A
的引用ConditionalWeakTable<TKey, TValue>
)。相反,import csv from datetime import datetime import random f=open("gh.csv","w") csv.reader(f) g=open("gh.csv","a") k=csv.writer(g) k.writerow(("age","ageband","gender","disease")) for i in range(10): k.writerow((random.choice((range(0,100))),'40-50',random.choice(['male','female']),random.choice(['heartstroke','breastcancer','hypertension','hive']))) for col in f: age=row[2] if 40<=age>=55: print '40-55' elif 56<=age>=75: print '56-75' elif 76<=age>=100: print '76-100' else : print 'age>20' f.close() age ageband gender disease 62 40-50 female breastcancer 15 40-50 female breastcancer 6 40-50 male breastcancer 59 40-50 male heartstroke 64 40-50 female breastcancer 98 40-50 female breastcancer 51 40-50 female heartstroke 95 40-50 male heartstroke 27 40-50 male breastcancer 31 40-50 male hypertension
会在表外没有其他对键的引用时自动删除键/值条目。
答案 1 :(得分:0)
正确答案是你已经给出的答案,扩展方法。
public static class PedExtensions
{
public static bool CheckIfTrue(this Ped ped)
{
if(ped.something != "this value")
{
return true;
}
return false;
}
}
&#34; this&#34;在方法签名中引用代码附加到的东西。所以var myPed = new Ped(); myPed.CheckIfTrue();将在扩展名中运行代码。